Текущий архив: 2003.07.07;
Скачать: CL | DM;
Вниз
---|Ветка была без названия|--- Найти похожие ветки
← →
Ihor Osov'yak (2003-06-17 12:28) [40]2 McSimm © (17.06.03 11:42)
присоединяюсь
Еще возможности определять локальные переменные в любом месте кода (см. uw © (17.06.03 11:51) как частный случай). Но с предупреждением компилятора для случая, если это определение перекрывает (прячет) вышестоящую локальную переменную..
А вот с макросами в паскале - не согласен.. Тогда там такого намакросируют..
Также иногда не хватает статических полей классов, ну и см. Юрий Зотов © (17.06.03 10:48) - но не на уровне фичи, а так сказать, документировано.. Зы - статические поля класса можно обойти посредством финта, о котором говорил Юрий Зотов © (17.06.03 10:48), но хотелось бы это не как фичу, а как легальную возможностть..
← →
uw (2003-06-17 12:33) [41]>KSergey © (17.06.03 12:25)
По-моему неплохо. Ведь ввели же конструкцию
on e: Exception do
← →
stone (2003-06-17 12:34) [42]ИМХО, не стоит превращать структурированный отлаженный язык в синтаксическое болото. Все необходимое есть, если кому-то чего-то не хватает, подключаем мозги и руки. Если не хватает мозгов, то Дельфи тут ни при чем.
← →
uw (2003-06-17 12:38) [43]>Ihor Osov"yak © (17.06.03 12:28)
>Еще возможности определять локальные переменные в любом месте кода
Общий случай имхо не пройдет - вся структура языка будет искорежена.
← →
Zz_ (2003-06-17 12:38) [44]Жутко не хватает в Delphi Language unsigned
В D2 мучался с DWORD
В D6 нет unsigned int64
← →
Ihor Osov'yak (2003-06-17 12:40) [45]> не стоит превращать структурированный отлаженный язык в синтаксическое болото
Вопрос был: " А каких языковых конструкций в Дельфи вам нехватает ? "
Это немного иная вещь, чем прызыв "ату тормозов с Борланда! мы счас такое забацаем !!"
← →
Ihor Osov'yak (2003-06-17 12:44) [46]2 uw © (17.06.03 12:38)
> >Еще возможности определять локальные переменные в любом
> месте кода
>
> Общий случай имхо не пройдет - вся структура языка будет
> искорежена.
Локальные - значит в пределах процедур, функций и методов классов. Я что-то не вижу угрозы общей концепции. Что принципиально изменится, если я декларацию перемещу от заголовка к какой-то строчке кода? Ну а некоторые проблемы с перекрытием имен в случае бардачного кодирования - я уже говорил - "Но с предупреждением компилятора для случая, если это определение перекрывает"
← →
mrcat (2003-06-17 12:45) [47]McSimm © (17.06.03 11:42)
>Очень простой вещи мне немножко не хватает.
>Ссылки на сам объект(не в смысле ООП) действия блока with, а не >только на его члены.
присоединяюсь. когда таких конструкций:
this := SomeObj.SomeProperty[SomeIndex];
if Assigned(this) then this.SomeMethod(...
в программе тьма, начинаешь раздражаться ;)
← →
Ihor Osov'yak (2003-06-17 12:50) [48]2 mrcat © (17.06.03 12:45)
а какое предложение будет?
← →
uw (2003-06-17 12:58) [49]>Ihor Osov"yak © (17.06.03 12:28)
То, что предложил Юрий Зотов, - это совсем не на уровне фичи, а документированное языковое средство - типизированые константы typed constants. По сути это переменная внутри подпрограммы, сохраняющая свои значения от вызова к вызову.
Статические (классовые) переменные, те, что реализованы в С++, Java, C#, - это вещь другая. От этого я бы тоже не отказался.
>Ihor Osov"yak © (17.06.03 12:44)
>Локальные - значит в пределах процедур, функций и методов классов. Я что-то не вижу угрозы общей концепции.
Упрощенно структура языка такова: раздел констант, раздел переменных, раздел процедур и функций. А внутри подпрограммы - то же самое, но есть еще раздел операторов. При этом строится сравнительно простой и очень быстрый компилятор. Если в раздел операторов мы будем вставлять переменные, как в С++, получим, думаю, скорость компилятора C++.
← →
NailMan (2003-06-17 13:01) [50]Присоединяюсь к vidiv © (17.06.03 05:50)
Очень не хватает Case со строками.
А также:
прямого сравнения TGUID-ов. Чтобы было как у всех, по-нормальному if GUID1=GUID2 then
а не через ActiveX-задничную isEqualGUID или как там ее.
← →
Mystic (2003-06-17 13:08) [51]
> McSimm © (17.06.03 11:42)
Введение специального объекта для nil + замена условного поведения полиморфизмом? В общем, когда мне надоедает писать if Assigned(...) я так и поступаю :)
← →
Плохой человек (2003-06-17 13:10) [52]> Кстати, при напиании шашек (то же относится и к шахматам) проверка на выход за пределы массива пишется не один десяток раз вручную...
Проверка на выход пишется один раз в жизни, запихивается в модуль MyProc.pas и используется всю жизнь.
← →
Mystic (2003-06-17 13:26) [53]
> Плохой человек (17.06.03 13:10)
Я имел в виду немного не то...
← →
McSimm (2003-06-17 13:36) [54]>Mystic © (17.06.03 13:08)
Ты не понял. Assigned() это только для примера.
В общем случае неплохо бы иметь доступ к тому, что в with (а там, зачастую, вызов метода. И вызывать его несколько раз нет желания, приходится заводить явную переменную, хотя with это и сам прекрасно делает, а язык не позволяет использовать)
← →
Ihor Osov'yak (2003-06-17 13:37) [55]2 uw © (17.06.03 12:58)
>Если в раздел операторов мы будем вставлять переменные, как в С++, получим, думаю, скорость компилятора C++.
Различие в скорости компилятора обусловлена не возможностью декларации локальных прямо по тексту процедуры или отличием оной. Для реализации этого достаточно поддержать простенькие манипуляции со стеком в момент декларации и в момент ухода из области видимости + контроль джампов за пределы этой области.. Задача не архи какая сложная..
> это совсем не на уровне фичи, а документированное языковое средство - типизированые константы typed constants.
Документированое, но используемое нетрадиционно. Вследствии чего страдает наглядность и читабельность кода. Плюс в седьмой и шестой делфи им уже напрямую присваивания не сделаешь.. Нужно работать через указатели.. Поэтому говорю об такой технике, как о фиче. А было бы намного приятнее написать декларацию static и не морочить голову..
← →
Ihor Osov'yak (2003-06-17 13:39) [56]или отличием оной. -> или отсутствием оной, сорри..
← →
uw (2003-06-17 13:57) [57]>Ihor Osov"yak © (17.06.03 13:37)
>Документированое, но используемое нетрадиционно. Вследствии чего страдает наглядность и читабельность кода.
>Плюс в седьмой и шестой делфи им уже напрямую присваивания не сделаешь.. Нужно работать через указатели..
Что-то я тебя не понимаю. И Darts (17.06.03 11:13) уже все понял и использует {$J+}, и я в uw © (17.06.03 11:37) писал про флажок Assignable typed constants в опциях компилятора D6. Все работает напрямую. А главное - очень традиционно, в точности так, как это делается в С в случае с переменными static внутри функции.
← →
Ihor Osov'yak (2003-06-17 14:10) [58]2 uw © (17.06.03 13:57)
> использует {$J+},
Спасибо, не внимательно смотрел. Есть все-же прок в "потрепаться".. Зы - я-то в основном на пятом работаю, старые проекты переводить лень..
← →
Всеволод Соловьёв (2003-06-17 15:21) [59]кену
а зачем ты вообще занимаешся программированием? ведь все что именно ты можешь придумать-сделать уже написано, придумано и сделано до тебя! Так зачем же ты занимаешся изобретением велосипедов? не легче ли взять игрушку и погамится в нее, чем изобретать велосипед?
← →
SPeller (2003-06-17 16:08) [60]
> NailMan © (17.06.03 13:01)
> А также:
> прямого сравнения TGUID-ов. Чтобы было как у всех, по-нормальному
> if GUID1=GUID2 then
> а не через ActiveX-задничную isEqualGUID или как там ее.
Это вообще-то стандартная API-шная функция: загляните в Win32SDK. Вопрос ещё, конечно, в каком виде эти GUID"ы представлены.
← →
DiamondShark (2003-06-17 16:19) [61]По поводу переменной в with.
И что же такая переменная будет означать в случае
with Obj1, Obj2, ... ObjN do ...
?
А вот от такой бы формы with я бы не отказался:
with Form1.ActiveControl do
on b:TButton do ...;
on e:TEdit do ...;
else ...
end
← →
NailMan (2003-06-17 16:39) [62]To -> SPeller ©
Это вообще-то стандартная API-шная функция: загляните в Win32SDK.
Ну не помню я точно где, может и оттуда.
Вопрос ещё, конечно, в каком виде эти GUID"ы представлены.
Не понял.
Я сравниваю 2 переменные типа TGUID, который жестко определен как запись содержащая числа и массивчики байтиков.
ЗЫ: Да, точно! Вот что мне не хватает! Простое сравнение 2- записей. Не по полям или побайтным сравнением, а нормальнымif Rec1=Rec2 then
(записи ессно однотипные). Объясните кто-нибудь почему этого еще в паскале небыло? Присваивать записи можно, а сравнивать(естесственно сравнивать на равенство) низзя?
← →
MalkoLinge (2003-06-17 16:43) [63]Мне нужна
перегрузка операторов.
В частности перегрузка AS а еще лучне перегрузка опасного приведения типов !!!!!!!!!!!!!!!
Но вот лично я против Макросов, объявлений переменных в любом месте - так как компилятор (ИМХО) перестанет быть однопроходным...
← →
Игорь Шевченко (2003-06-17 16:46) [64]MalkoLinge © (17.06.03 16:43)
Очень извиняюсь, а как можно AS перегрузить ?
← →
Sandman25 (2003-06-17 17:13) [65]С эстетической точки зрения мне не хватает операторов
if ... then ... end if
while ... do ... end while
case ... of ... end case
для структурности.
Особенно запутывают ситуацию begin end"ы.
Еще было бы неплохо иметь макросы, локально-блочные переменные (не очень наглядно использовать одну и ту же i в нескольких for подряд, имеющих разные параметры). А из того, о чем еще не писали, очень хотелось бы иметь другой синтаксис для try/finally/except - слишком часто приходится использовать вложенные конструкции, в результате строка кода начинается чуть ли не с середины страницы. Использовать процедуры только для того, чтобы уменьшить отступ - не лучший выход ИМХО.
← →
vuk (2003-06-17 17:21) [66]Хотите case по строкам?
case ANSIIndexText( str, ["aaa", "bbb", "ccc"]) of
0:...; //aaa
1:...; //bbb
2:...; //ccc
else
...;
end;
Смысл тот же и не надо лишних сущностей.
to DiamondShark:
Кстати о птичках. Точно таким же образом предложенную Вами форму with можно сотворить (даже с учетом проверки типов предков), ведь по сути это не with, а case.
← →
DiamondShark (2003-06-17 18:11) [67]
> Sandman25 © (17.06.03 17:13)
С эстетической точки зрения -- Модула, или Оберон. Блочность красивше паскалевской.
> vuk © (17.06.03 17:21)
Это мне Оберон навеял. Там with несколько другой смысл имеет -- защищённое приведение типов и без изменения области видимости.
Т.е. конструкция
WITH ObjVar:Type DO
...
END;
эквивалентна дельфийскому
with (ObjVar as Type) do ...
А я ещё расширить постарался.
ЗЫ
для особо извращённых
try
raise Form1.ActiveCOntrol
except
on b: TButton do ... ;
on e: TEdit do ... ;
else ...
end;
← →
clickmaker (2003-06-17 18:19) [68]Я бы не отказался от
drink = (button == mbLeft) ? coffee : beer;
← →
vuk (2003-06-17 18:21) [69]to DiamondShark:
>Это мне Оберон навеял.
Я так и понял. :o)
← →
Юрий Зотов (2003-06-17 18:29) [70]> DiamondShark © (17.06.03 16:19)
> По поводу переменной в with.
> И что же такая переменная будет означать в случае
> with Obj1, Obj2, ... ObjN do ...
То же, что и обычно - в таких случаях любая конструкция относится к последнему объекту, а если неприменима к нему - то к предпоследнему и т.д. В данном случае this будет означать ObjN.
Но в данном случае такая переменная и не нужна, поскольку можно просто указать уже имеющуюся ссылку. Речь шла о случаях, когда такой ссылки нет. Мне тоже иногда ее не хватает.
← →
Sandman25 (2003-06-17 18:34) [71]DiamondShark © (17.06.03 18:11)
>С эстетической точки зрения -- Модула, или Оберон. Блочность красивше паскалевской.
Так я в основном работаю на Informix-4GL - довольно древний язык для работы с БД, но вот в этом отношении удобнее. Там еще есть конструкции EXIT CASE, EXIT WHILE, EXIT FOR, CONTINUE WHILE, CONTINUE FOR вместо безличных BREAK и CONTINUE Паскаля.
Особенно удобно бывает вот так:
WHILE true
...
FOR i=1 TO 10
...
CONTINUE WHILE; -- не FOR, а именно WHILE
...
END FOR
...
END WHILE
← →
vuk (2003-06-17 18:36) [72]Я вообще в случае с несколькими объектами стараюсь with не использовать - путаницы не будет. По большому счету, введение псевдонима для объекта в with меняет его смысл. Из оператора доступа к структуре он превращается воператор изменения имени переменной.
← →
MalkoLinge (2003-06-17 18:51) [73]
> Очень извиняюсь, а как можно AS перегрузить ?
Что мы делаем при AS пишу мнемокод
(Object as TClassType) = if Object is TClassType then
Result:=TClassType(Object)
else Raise
Я хочу чтобы в моем As было по другому :)
← →
Юрий Зотов (2003-06-17 18:51) [74]> vuk © (17.06.03 18:36)
> он превращается воператор изменения имени переменной.
Или его назначения вообще без всякой переменной:
with TStringList.Create do
try
...
Memo1.Lines.Assign( this)
finally
Free
end;
Пример не вполне удачен (в данном случае можно использовать Text), но смысл показывает.
← →
vuk (2003-06-17 18:58) [75]to Юрий Зотов:
Это все понятно. Суть все равно та же самая - неявной переменной дается другое имя, уже явное.
← →
Fantasist. (2003-06-17 20:10) [76]
> Поддерживаю Johnny Smith © - нужны макросы
> .....
> Препроцессор бы не помешал. Со всеми вытекающими...
А в чем проблема? У меня уже есть такой. Пока он не делает ничего сложного (подставляет вместо __LINE__ и __FILE__ номер строки, и название модуля), но это дело времени и не думаю, что большого, ибо синтаксический анализатор у меня уже есть.
Реализуется путем написания эксперта под Delphi IDE. Есть событие BeforeCompile.
← →
VD601 (2003-06-17 21:16) [77]ЮЗ, не пойму вашу фичу с Inc(MyVar). Компилятор вполне законно ругается Left side cannot be assgned to.
← →
uw (2003-06-17 23:24) [78]>VD601 (17.06.03 21:16)
Посмотри это: uw © (17.06.03 13:57)
← →
Fantasist. (2003-06-18 01:11) [79]А вообще, не хватает try ... except ... finally ... end; как в Java. Есть либо try/except, либо try/finally. А так как в Delphi автоматических объектов нету, приходиться извращаться типа:
obj:=TObj.Create;
try
obj.DoWork;
except
on e:exception do
begin
Log(e); //рапортуем об ошибке
obj.Free; //освобождаем
end;
end;
obj.Free;
Да и сам синтаксис on e:exceptiontype do - слишком многословен. Гораздо красиве выглядело бы:
try
....
except (E:SysException)
...
except (E:OleException)
...
except (E:Exception)
...
end;
← →
Кен (2003-06-18 02:27) [80]> blackweber © (17.06.03 08:58)
> > Кен ©
> Вроде человек с высшим образованием(если верить анкете,
> хотя я что-то сомневаюсь), а такую фигню лепишь.
> Значит рано писать шахматы, раз с массивами не справиться.
Надо же ! Для меня новость, что у меня в анкете написано такое. Я не писал этого. Мастаки шутят наверное.
Обычно я правды о себе в Интернете нигде не пишу. Нехочу весь мир о себе информировать ?
> Юрий Зотов © (17.06.03 09:16)
> > Кен
>
> Извините, сразу видно, что на старых языках Вы не работали.
> Не горевать, а радоваться надо, что при выходе за границы
> массива возникает ошибка. Даже если, как Вы предлагаете,
> такие попытки игнорировать, программа все равно будет работать
> неверно, только вот причину Вы будете искать очень долго.
> А тут Вам на блюдечке преподносят и причину, и место ошибки.
>
> Паскаль тем и хорош, что вопит по любому поводу. Если бы
> этого не было, ошибок в программах было бы на порядок больше,
> а искать их было бы на порядок сложнее. Такую фичу ценить,
> а не ругать нужно.
Тогда как управлять ошибками ? Чтобы отделять эти ошибки от других и их игнорировать. Чую, что что то через try . Но как именно ?
> Юрий Зотов © (17.06.03 10:48)
> > статические переменные с областью видимости - функция
> (метод),
> > а не модуль...
>
> А как насчет вот этого:
>
> function A: integer;
> const
> MyVar: Integer = 0;
> begin
> Inc(MyVar);
> Result := MyVar
> end;
А как в этом случае сделать A := 0; ?
> Mystic © (17.06.03 11:42)
> Кстати, при напиании шашек (то же относится и к шахматам)
> проверка на выход за пределы массива пишется не один десяток
> раз вручную...
О том и речь, что неудобно это.
> VD601 (17.06.03 21:16)
> ЮЗ, не пойму вашу фичу с Inc(MyVar). Компилятор вполне законно
> ругается Left side cannot be assgned to.
Вот так вот вроде.
{$J+}
function A: integer;
const
MyVar: Integer = 0;
begin
Inc(MyVar);
Result := MyVar
end;
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2003.07.07;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.013 c