Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

Какой должен быть язык   Найти похожие ветки 

 
REA   (2007-03-16 14:13) [0]

Вот всем кажется меня Object Pascal устраивает, но некоторые вещи понять не могу.
1) Для чего слово Interface, которое перед Implementation? Ясное дело, что все что перед Implementation и есть интерфейс.
2) Почему перед Else нельзя ставить ";". Т.е. мне это не сильно мешает, но кажется нет особой разницы.
3) Для чего нужны слова Do кроме крастоты?
4) Почему константы c типом объявляются как Const, а не как Var с инициализацией?
5) Для чего в вариантных частях записей идентификатор?

Какие по вашему можно было бы внести изменения в семантику языка (record helpers в другой ветке :) )?


 
Игорь Шевченко ©   (2007-03-16 14:15) [1]


> но некоторые вещи понять не могу.


Считай, что это вещи, данные свыше


 
REA   (2007-03-16 14:21) [2]

Да я так и считаю, но хочется выслушать и "начальника транспортного цеха".
Мне например один раз понадобилось дополнить компонент TControl без изменения исходного кода оного. Пришлось перегружать нужных потомков с общим интерфейсом. А можно было бы например написать Class Extension, если бы язык позволял. Хотя это спорно конечно...
Garbage Collection тоже вероятно не помешал бы или хотя бы предупреждения о том что память не освободилась (не выделилась). Это есть в FastMem, но как то не так...


 
ArtemESC ©   (2007-03-16 14:21) [3]

Переходи на С, там должно все устраивать (кроме 4, правда) ...


 
jack128 ©   (2007-03-16 14:22) [4]

REA   (16.03.07 14:13)
2) Почему перед Else нельзя ставить ";". Т.е. мне это не сильно мешает, но кажется нет особой разницы

потому что ";" - разделитель операторов.
REA   (16.03.07 14:13)
4) Почему константы c типом объявляются как Const, а не как Var с инициализацией?

из-за обратной совместимости.
REA   (16.03.07 14:13)
5) Для чего в вариантных частях записей идентификатор?

Для большей наглядности.
Помоему так

Trec = record
case RecType: Integer of
  0: ...;
  1: ...;
  2: ...;
end
гараздо нагляднее, чем так:
Trec = record
RecType: Integer;
case Integer of
  0: ...;
  1: ...;
  2: ...;
end


 
Сергей М. ©   (2007-03-16 14:22) [5]

1) ну раз ясно, то какие сомнения могут быть ?)

2) Потому что Паскаль. А уж объектный он там или не объектный -  по барабану. Правила Паскаля они и в африке правила Паскаля.

3) Оно тебе сильно мешает ?

4) Сам-то понял, что сказал ?)

5) Идентификатор чего ?


 
REA   (2007-03-16 14:32) [6]

>1) ну раз ясно, то какие сомнения могут быть ?)
Ну и ликвидировать это слово :)

2) напрягает только ставить-удалять эту ; когда можифицируешь код. Но это действительно не так важно.

>3) Оно тебе сильно мешает ?
уже нет :) а так набивать лишние буквы приходится. вопрос не в том мешает или нет, а в том как было бы лучше и удобнее. Так же можно опустить и некоторые Of.

>4) Сам-то понял, что сказал ?)
Поясню I: Integer = 10; это переменная.

5) А еще лучше так:
Record
 Case
    Rectangle: (Height, Width: Real);
    Triangle: (Side1, Side2, Angle: Real);  
 End;
End; Причем тоже Rectangle можно и опустить.


 
Сергей М. ©   (2007-03-16 14:46) [7]


> Ну и ликвидировать это слово :)


Ну а Object Pascal причем тут ?)

Ты уж сразу в Паскале как таковом ликвидируй его)


> 2) напрягает


Для особо "напряженных" существуют эксперты)


> набивать лишние буквы приходится


Матчасть среды нужно знать.

см. Code Completion


> I: Integer = 10; это переменная.


Да что ты ?!

А я-то думал, что переменная - это некая декларация в контексте текущей var-секции)


 
REA   (2007-03-16 14:56) [8]

Еще раз скажу - я не пытаюсь изувечить сам язык Pascal. Я пытаюсь конструктивно обсудить что в языке необходимо, а что нет.
В С например без Do обходятся. Сейчас все скажут - "ну и переходи на C".
По ряду причин не собираюсь и речь не об этом.

>Для особо "напряженных" существуют эксперты)
В том гипотетическом языке пока никаких экспертов нет :)

> I: Integer = 10; это переменная.
> Да что ты ?!

Ну уж точно не константа раз ее можно поменять. А в var секции такое не пройдет.

Хочется кроме критики услышать и предложения. Только не говорите, что не надо ничего добавлять - убавлять. Сам Борланд продолжает это делать.


 
Alex Konshin ©   (2007-03-16 14:59) [9]

Кстати, (3) - неправда.
Кто первый приведет случай, когда перед else не только можно, но и нужно ставить точку с запятой?
Все на самом деле объясняется отсутствием завершителей у конструкции if then else.


 
Сергей М. ©   (2007-03-16 15:10) [10]


> В С например без Do обходятся


Зато там выражение, определяющее начальные параметры и граничные условия цикла, заключается в скобки. Меня, например, это "напрягает" больше чем паскалевый "do", а тебя ?


> В том гипотетическом языке пока никаких экспертов нет


Его ни в каком языке нет)


> уж точно не константа раз ее можно поменять. А в var секции
> такое не пройдет


Константные типизированные данные тоже можно менять.
На то у компилятора есть соотв.опция.
Опять же - учи матчасть.


> в var секции такое не пройдет


ЧТО не пройдет ? Статическая инициализация что ли ?
Это с какого перепугу ?)


 
McSimm_   (2007-03-16 15:11) [11]


> когда перед else не только можно, но и нужно ставить точку
> с запятой?

case else


> объясняется отсутствием завершителей у конструкции if then
> else

в PHP тоже нет endif, однако:
if (cond)
 statement;
else
 statement;


 
REA   (2007-03-16 15:14) [12]

>Кстати, (3) - неправда.

For i := 0 To 10 Do X := X + 1;
For i := 0 To 10 X := X + 1; - чем такая конструкция не валидна?
ну или такая
For (i := 0..10)

>Кто первый приведет случай, когда перед else не только можно, но и нужно ставить точку с запятой?
А кто приведет, что нельзя?

>Все на самом деле объясняется отсутствием завершителей у конструкции if then else.
В смысле? Не очень понятно.
В С например проходит такое:
if(begin==NULL)
 begin=rex;
else
 end->next=rex;
к слову сказать и слово Then тоже не очень нужно.


 
jack128 ©   (2007-03-16 15:15) [13]

McSimm_   (16.03.07 15:11) [11]
case else


в этом случае можно, но не нужно ставить ";"


 
Kolan ©   (2007-03-16 15:17) [14]

> к слову сказать и слово Then тоже не очень нужно.

Зато нужны скобочки, так чт шило на мыло...


 
McSimm_   (2007-03-16 15:23) [15]


> в этом случае можно, но не нужно ставить ";"

case ... if then ; else ;


 
REA   (2007-03-16 15:32) [16]

- Не помешало бы слово Return или Exit(Result)

Вот к примеру C#, чтобы уже не акцентировать внимание на самом Pascal:
- Частичные типы (разделение реализации класса более чем на один файл). - хорошо ли это?

- слово yield - мне показалось больше путаницы от этого

В C# 3.0 появились следующие радикальные добавления к языку:
ключевые слова select, from, where, позволяющие делать запросы из SQL, XML, коллекций и т. п. (запрос, интегрированный в язык, LINQ)
- это странно

Инициализация объекта вместе с его свойствами
Customer c = new Customer(); c.Name="James";
- неплохо, но синтаксис не очень...

Методы-расширения — добавление метода в существующий класс с помощью ключевого слова this при первом параметре статической функции. - тоже непривычно...


 
Сергей М. ©   (2007-03-16 15:51) [17]


> REA


Ты замахнулдся на "святое" - на Паскаль.
А Паскаль изначально позиционировался как учебный язык, в котором обучающемуся было (и должно было быть, по задумке разработчика) все предельно понятно:

While Логическое_выражение Do Нечто

даже ИНТУИТИВНО переводилось на "человеческий" язык как

Пока истинно условие, заданное логическим выражением Логическое_выражение Делать Нечто


 
Игорь Шевченко ©   (2007-03-16 15:56) [18]

Вообще ничего не нужно. Нужен один оператор DWIM


 
McSimm_   (2007-03-16 16:00) [19]

"Do what I mean" ?
:)


 
REA   (2007-03-16 16:04) [20]

Сам паскаль никто не трогал. Речь о языке "вообще" - т.е. каким он мог бы быть (см. выше). Согласен, что Do, Then и Of украшают язык, но в принципе можно было бы и без них обойтись.


 
Сергей М. ©   (2007-03-16 16:05) [21]


> 5) Для чего в вариантных частях записей идентификатор?

Хотя бы для того чтобы ты изучил ВСЕ возможности компилятора в части применения этого самого идентификатора.


 
Игорь Шевченко ©   (2007-03-16 16:07) [22]

McSimm_   (16.03.07 16:00) [19]

Конечно :)


 
Сергей М. ©   (2007-03-16 16:10) [23]


> REA   (16.03.07 16:04) [20]


Любой язык программирования обладает своими "прелестями" и несуразностями/недостатками.
Ибо заточен под конкретную программистскую аудиторию и конкретные задачи.
Паскаль - не исключение.

Желаешь анонсировать свой собственный язык с оригинальной спецификацией ?
Дерзай !


 
clickmaker ©   (2007-03-16 16:13) [24]


> Согласен, что Do, Then и Of украшают язык, но в принципе
> можно было бы и без них обойтись

да ладно. Работа сидячая, так пусть хоть пальцы лишний раз разомнутся


 
REA   (2007-03-16 16:21) [25]

>Хотя бы для того чтобы ты изучил ВСЕ возможности компилятора в части применения этого самого идентификатора.

В С обходятся без этих возможностей да и пользы от них не так уж много.
Например как использовать в этом примере Rectange?

   case TShapeList of
     Rectangle: (Height, Width: Real);
     Triangle: (Side1, Side2, Angle: Real);
     Circle: (Radius: Real);
     Ellipse, Other: ();


 
REA   (2007-03-16 16:24) [26]

В общем следствие зашло в тупик - как я и предполагал дело ограничится критикой, экзорцизмом и остракизмом...


 
Alkid ©   (2007-03-16 16:28) [27]

Ну лично я бы в язык внёс следующие возможности:
1. Шаблоны или generic`s. Первое предпочтительне. Как там, кстати, с дженериками в .NET-версиях дельфи?
2. Нормальный Reflection (ну в .NET он и так есть, а в native-версии пригодился бы).
3. Стандартную библиотеку с возможностями типа STL (только не в таком стиле, плз :-) )


 
clickmaker ©   (2007-03-16 16:33) [28]


> 3. Стандартную библиотеку с возможностями типа STL

а зачем?
чего в VCL нет, для чего может понадобиться эта stl?


 
Плохиш ©   (2007-03-16 16:38) [29]

Всегда прикольно читать до какого маразма доходят индивидумы, когда заняться нечем :-)


 
Alkid ©   (2007-03-16 16:43) [30]


> чего в VCL нет, для чего может понадобиться эта stl?

Да вот VCL беден по части контейнерных классов. Например, нужен мне
map. Или set (не тот, который в паскале, а, например, set сторк. Или определённых мною объектов). Или двусвязаный список. Причём без тайпкастов и лишей писанины.


 
clickmaker ©   (2007-03-16 16:48) [31]


> Например, нужен мне
> map.

TStringList не потянет? с его names - values
шаблон - тоже ведь палка о двух концах. Удобство за счет размера сгенеренного кода.


 
alien1769 ©   (2007-03-16 16:51) [32]


> 5) Для чего в вариантных частях записей идентификатор?

Судя по вопросу, автор их не использовал.
Далее сам подтвердил :

> Например как использовать в этом примере Rectange?
>
>    case TShapeList of
>      Rectangle: (Height, Width: Real);
>      Triangle: (Side1, Side2, Angle: Real);
>      Circle: (Radius: Real);
>      Ellipse, Other: ();


 
Сергей М. ©   (2007-03-16 16:51) [33]


> REA   (16.03.07 16:21) [25]


> как использовать в этом примере Rectange?


Как это "как" ?!

Прямо вот так:

ShapeList.Rectangle.Height

Понимаешь ли, еще раз повторяю, Паскаль позиционируется как строго типизированный язык (и в этом есть ощутимые прелести !), он изначально не планировался для поблажек "особо одаренным", понимающим что ShapeList.Height не может иметь отношения ни к чему более, нежели к ShapeList.Rectangle.Height


 
Alkid ©   (2007-03-16 16:54) [34]


> TStringList не потянет? с его names - values
> шаблон - тоже ведь палка о двух концах. Удобство за счет
> размера сгенеренного кода.

Нет, не потянет. А если ключами у меня должны быть числа (GUID`ы, и т.п.), а
значениями - весьма крупные и сложные объекты. Что же - кастовать всё в стинги? Да и подумай о производительности. В map сложность поиска логарифмическая, а в StringList - линейная.

Что же до размеров кода, то это действительно так, но сейчас это не так страшно. В конце концов, на С++ это сейчас не является дикой проблемой, а время и удобство разработчка важнее. (Как правило).

При этом я не напираю на стиль STL - он местами ужасен. :)


 
Alkid ©   (2007-03-16 16:55) [35]

Да, ещё забыл важную фишку - First-class functions или хотя бы function objects


 
REA   (2007-03-16 17:01) [36]

>ShapeList.Rectangle.Height

Ты сам то пробовал, одаренный ты наш?


 
REA   (2007-03-16 17:04) [37]

Расскажите темному - что такое Reflection и First-class functions?

Нужны ли static переменные в языке?


 
REA   (2007-03-16 17:06) [38]

Map и Hash там какие то есть...
Меня все же интересует больше не стандартные компоненты и классы, а сам язык.


 
alien1769 ©   (2007-03-16 17:09) [39]

Автору по вопросу о записях:

Remarks:
Each field list is a comma-separated list of identifiers, followed by a
colon and a type.

Example:
{ Record Type Definitions }
type
  Class  = (Num, Dat, Str);
  Date   = record
     D, M, Y: Integer;
  end;
  Facts = record
    Name: string[10];
    case Kind: Class of
      Num: (N: real);
      Dat: (D: Date);
      Str: (S: string);
  end;


 
Alkid ©   (2007-03-16 17:12) [40]

Reflection - это возможность получать информацию о структуре типов в run-time.
Т.е. списки методов, пропертей, полей и т.п. классов.

First-class functions - это функции, которыми можно оперировать, как другими значениями, т.е. передавать как параметры в другие функции и возвращать как результат выполнения. В принципе, наличие указателей на функции в паскале делает это возможным, но не без извратов.


 
REA   (2007-03-16 17:15) [41]

И как адресоваться к Num например? (а не к N)
Т.е. можно присвоить Facts.Kind := Num; но зачем?


 
jack128 ©   (2007-03-16 17:17) [42]

Alkid ©   (16.03.07 17:12) [40]
В принципе, наличие указателей на функции в паскале делает это возможным, но не без извратов.


В чем изврат то?


 
REA   (2007-03-16 17:17) [43]

>Reflection - это возможность получать информацию о структуре типов в run-time.

Это круче реализовано, чем RTTI?

>В принципе, наличие указателей на функции в паскале делает это возможным, но не без извратов.

Да вроде не было с этим сложностей. В C# ввели какие то делегаты... до конца не понял где тут удобство.


 
clickmaker ©   (2007-03-16 17:25) [44]


> В C# ввели какие то делегаты

как не назови - суть одна. Указатель на точку входа в некую функцию
В VB так прямо и пишут AddHandler ... AddressOf func


 
Alkid ©   (2007-03-16 17:28) [45]


> В чем изврат то?

Ну хорошо, вот напиши мне на паскале функцию, которая принимает в качестве параметров две функции, вида
function (i : double) : double;

И возвращает функцию такого же вида, которая вычисляет сумму этих двух фукнций?

Я на лету не могу сообразить, как это сделать на паскале.


 
Alkid ©   (2007-03-16 17:29) [46]


> Это круче реализовано, чем RTTI?

Да. RTTI в Delphi работает только по published типам, да и там его возможности послабее. Но цели преследуются одни и те же.

> Да вроде не было с этим сложностей. В C# ввели какие то
> делегаты... до конца не понял где тут удобство.

Делегаты есть и в Дельфи.
Сложности - я тут jack128 задачку задал.


 
clickmaker ©   (2007-03-16 17:30) [47]


> И возвращает функцию такого же вида, которая вычисляет сумму
> этих двух фукнций?

type TFunc=function(...);
TFunc может быть и возращаемым значением, если уж очень надо


 
Alkid ©   (2007-03-16 17:30) [48]


> как не назови - суть одна. Указатель на точку входа в некую
> функцию

Не совсем. Если речь идёт статической (читай - глобальной) функции, то да.
А если о instance method, то надо хранить ссылку на экземпляр и на точку входу.


 
Alkid ©   (2007-03-16 17:31) [49]


> type TFunc=function(...);
> TFunc может быть и возращаемым значением, если уж очень
> надо

Ну и что? Ты мне код приведи, плз, а тут только описание типа.


 
clickmaker ©   (2007-03-16 17:33) [50]


> Ты мне код приведи, плз

задача до конца не понятна и кажется слишком уж притянутой за уши...
в каком случае такой изврат нужен?


 
jack128 ©   (2007-03-16 18:05) [51]

Alkid ©   (16.03.07 17:28) [45]
И возвращает функцию такого же вида, которая вычисляет сумму этих двух фукнций?


А то, что должна возвращаться именно функция - это так принципиально?  Чем объект/интефейс - плох?

Если я правельно понял задачу, то так например:

TFunc = function (D: Double): Double;
IFuncSummator = interface
 function GetSum(D1, D2: Double): Double;
end;
TFuncSummator = class(TInterfacedObject, IFuncSummator)
private
 F1, F2: TFunc;
public
 constructor Create(Arg1, Arg2: TFunc);
 function GetSum(D1, D2: Double): Double;
end;

function GetSummator(F1, F2: TFunc): IFuncSummator;
begin
 Result := TFuncSummator.Create(F1, F2);
end;

использование:

var
 Summator: IFuncSummator;
begin
 Summator := GetSummator(@Sin, @Cos);
 ShowMessage(FloatToStr(Summator.GetSum(0.5, 0.9)));
end;


 
Игорь Шевченко ©   (2007-03-16 18:07) [52]

Alkid ©   (16.03.07 17:28) [45]

Ну не является паскаль языком функционального программирования, не Эрланг он нифига. Что же теперь, застрелиться ?



Страницы: 1 2 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.034 c
4-1164017360
001
2006-11-20 13:09
2007.04.08
Подскажите пограмму для мониторинга сообщений чужой программы


2-1174159453
Malik
2007-03-17 22:24
2007.04.08
Как можно узнать какие папки находяться в определённом каталоге


1-1171151514
Легалайз
2007-02-11 02:51
2007.04.08
Дельфи не ловит access violation


15-1173700587
Prohodil Mimo
2007-03-12 14:56
2007.04.08
TComboBox с двумя колонками.


2-1174377014
DimonS
2007-03-20 10:50
2007.04.08
Имя пользователя из-под Delphi