Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.047 c
15-1173880304
lak-b/proxy/
2007-03-14 16:51
2007.04.08
помогите с алгоритмом


6-1161702620
-Sirian-
2006-10-24 19:10
2007.04.08
Set-Cookie


15-1173637687
wacom
2007-03-11 21:28
2007.04.08
HTTP прокси


2-1174045916
Kolan
2007-03-16 14:51
2007.04.08
А AV в модуле rtl100.bpl что значит ? Дубль два.


2-1174086717
Expell
2007-03-17 02:11
2007.04.08
Time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский