Форум: "Потрепаться";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Вниз; not allowed before ELSE Найти похожие ветки
← →
Dmitriy O. (2003-12-26 08:09) [0]А собственно почему незя ставить ";" перед else ?
Чем вызванна такая фишка ?
← →
MBo (2003-12-26 08:13) [1]Тебе знакомо понятие "оператор"?
← →
mfender (2003-12-26 08:14) [2]Полагаю, это все виноваты капиталисты, которые придумали вязанку if...then...else;
← →
Sergey13 (2003-12-26 08:26) [3]2Dmitriy O. © (26.12.03 08:09)
Подозреваю, что с помощью этого хитрого финта ты хотел бы увеличить количество ежедневно пишущихся строк кода. Не выйдет. 8-)
← →
Style (2003-12-26 08:29) [4]Почему нельзя, можно:
case I of
1..5: Caption := "Low";
6..9: Caption := "High";
0, 10..99: Caption := "Out of range";
else
Caption := "";
end;
:)
← →
blackman (2003-12-26 09:24) [5]Положим и точка с запятой - архаизм :)
Пробелы и концы строк все решают :)
Попробуйте не поставить ; в нужном месте и компилятор скажет, что это ошибка. Если он ошибку нашел, то логично было бы ее и исправить. :)
← →
Юрий Зотов (2003-12-26 09:26) [6]> Dmitriy O. © (26.12.03 08:09)
> Чем вызванна такая фишка?
Тем, что точка ставится в КОНЦЕ предложения, а не в его СЕРЕДИНЕ (да и то не всегда).
← →
Alex Konshin (2003-12-26 09:56) [7]>Юрий Зотов © (26.12.03 09:26) [6]
>> Dmitriy O. © (26.12.03 08:09)
>> Чем вызванна такая фишка?
>Тем, что точка ставится в КОНЦЕ предложения, а не в его СЕРЕДИНЕ (да и то не всегда).
А сишники и джавовцы с вами не согласятся. Хотя я согласен, что не ставить точку с запятой внутри statement более логично.
Расмотрим такой пример:
case i of
1: if a>b then DoSomething
else
DoSomethingElse;
end;
Как мы видим, точка с запятой после DoSomething имеет примерно такой же смысл, как и в фразе "казнить, нельзя помиловать". Синтаксически обе конструкции верны, потому компилятор не сможет догадаться как было задумано.
Мое мнение может прозвучать ересью на этом форуме: синтаксис Pascal был проработан плохо.
Вот другой пример: конструкция case в record явно выглядит исскуственно, плохо читается и, вдобавок ко всему имеет другой синтаксис, чем statement case (нет завершающего end).
← →
Romkin (2003-12-26 10:05) [8]А у сишников предложения короче. И вообще другие. Поэтому :)
← →
blackman (2003-12-26 10:16) [9]>синтаксис Pascal был проработан плохо.
Согласен, коряво.
>DoSomethingElse;
А здесь ; можно и не ставить D6 схавает :)
← →
Dmitriy O. (2003-12-26 10:20) [10]Синтаксис плохой. Я вообще не понимаю назначение -> ;
В VB такого нет и все работает нормально.
← →
Юрий Зотов (2003-12-26 10:22) [11]> Alex Konshin © (26.12.03 09:56) [7]
> потому компилятор не сможет догадаться как было задумано
Вот именно поэтому semicolon внутри statement и не нужен.
> синтаксис Pascal был проработан плохо.
Мне доводилось писать парсеры с Паскаля. Вот когда начинаешь понимать, насколько же велик Вирт. Уверяю Вас, синтаксис классического Паскаля не то что хорош - он просто великолепен. В нем математическая краткость, логичность, строгость и однозначность замечательно сочетаются с необычайной близостью к естественному языку и поистине неограниченными возможностями творить произвольно сложные конструкции из чрезвычайно малого количества чрезвычайно простых кирпичиков. Это красиво.
Конечно, современные Паскалеобразные языки несколько другие - практика берет свое. Даже Turbo Pascal уже не был строго классическим Паскалем, не говоря уже о языке Delphi. Но главные черты сохранились. А главное, я считаю, в том, что синтаксис языка и компилятор не мешают Вам делать все, что Вам только захочется - но при этом очень надежно страхуют от ошибок.
Будет свободное время - распишите БНФ какого-нибудь небольшого подмножества Паскаля. Сразу же убедитесь, насколько красив и точен его синтаксис.
← →
Sha (2003-12-26 10:25) [12]Alex Konshin © (26.12.03 09:56) [7]
Полностью согласен.
Я всегда ставлю точку с запятой после "begin" и после оператора, предшествующего "end".
А тем, кто говорит, что это неправильно, отвечаю, что точка с запятой стоит после пустого оператора :)
← →
Ega23 (2003-12-26 10:29) [13]А у меня начальник всегда такую конструкцию выдаёт:
if A=True then ....
Я его спрашивал почему, говорит - привычка.
← →
Sha (2003-12-26 10:29) [14]Юрий Зотов © (26.12.03 10:22) [11]
Согласен со всем, кроме точки с запятой.
Кажется, компилятор с Pascal, написанный на Pascal, короче соответствующих компиляторов для других языков.
← →
Alex Konshin (2003-12-26 10:40) [15]>> потому компилятор не сможет догадаться как было задумано
>Вот именно поэтому semicolon внутри statement и не нужен.
А я о чем? Я о о том, что он непоследователен.
Знаешь, теорию компиляции я тоже знаю не по-наслышке (плавали, знаем).
Ты когда-нибудь описание синтаксиса Algol-68 читал?
Вот по сравнению с ним синтаксисы и паскаля, и C/C++ выглядят очень бледно и некрасиво. Я также соглашусь, что и его синтаксис тоже не идеал.
Кстати, если будет свободное время, все-таки попробуй как-нибудь расписать БНФ для Паскаля по-настоящему, и ты увидишь, что он не просто далек от идеала, но и не может быть через них выражен строго, если не прибегать к описанию словами. Я как-то на это натолкнулся, когда писал компилятор грамматик. Тот синтаксис, что написан в большинстве книжек - липа. Хотя, по правде сказать, я думаю, что подобные проблемы будут с любым широкоиспользуемым языком программирования.
← →
Sha (2003-12-26 10:45) [16]> Alex Konshin © (26.12.03 10:40) [15]
> ... если не прибегать к описанию словами...
Очень интересно. Это где? Пример необязательно. Просто суть.
← →
Юрий Зотов (2003-12-26 11:06) [17]> Alex Konshin © (26.12.03 10:40) [15]
> Я о о том, что он непоследователен.
Дык... а в чем же непоследовательность? Как только мы ставим правилом, что semicolon внутри statement не допускается - так тут же все становится вполне однозначно и вполне логично. Очень даже последователен.
Вариант 1:
case i of
1: if a>b then DoSomething
else
DoSomethingElse
end;
Здесь else является ветвью if в силу вложенности конструкций.
Вариант 2:
case i of
1: if a>b then DoSomething;
else
DoSomethingElse
end;
А здесь else является ветвью case в силу semicolon.
Все совершенно понятно и очень логично.
> Ты когда-нибудь описание синтаксиса Algol-68 читал?
68 - не читал, а вот 60 - читал. И нахожу, что синтаксис Паскаля как раз очень похож на синтаксис Алгола (что, в общем-то, и не удивительно, если вспомнить историю этих языков - оба первоначально строились, как некие, скажем так, метаязыки).
> но и не может быть через них выражен строго, если не
> прибегать к описанию словами.
Алекс, ну ты меня убил просто. Это же известнейшая вещь, называется "семантика", и она имеет место быть во ВСЕХ языках. Есть синтаксис (который можно описать формально), а есть семантика, которая формальному описанию (в виде БНФ или синтаксических диаграмм) не поддается и потому ВСЕГДА описывается словами (например, "длина идентификатора не может превышать N символов, а значащими из них являются первые M символов"). Так что Паскаль здесь абсолютно не виноват, уж тогда, скорее, виновата несовершенность известных методов формального описания языков.
> Тот синтаксис, что написан в большинстве книжек - липа. Хотя,
> по правде сказать, я думаю, что подобные проблемы будут с
> любым широкоиспользуемым языком программирования.
Естественно. Так и должно быть - как раз из-за семантики.
← →
ИдиотЪ (2003-12-26 11:10) [18]в бейсике ввели end if и тому подобное и порядок, а здесь решили сократить на этом, вот отсюда все беды
← →
Darts (2003-12-26 11:11) [19]А как насчет синтаксиса Modula-2, Oberon-2? Что скажет народ?
← →
Alex Konshin (2003-12-26 11:14) [20]>> Alex Konshin © (26.12.03 10:40) [15]
>> ... если не прибегать к описанию словами...
>Очень интересно. Это где? Пример необязательно. Просто суть.
На вскидку сразу вспоминается проблема с неявным приведением типов, например, integer -> float. Описать с помощью БНФ это вроде как можно, только при компиляции грамматики вскрываются неодназначности: без контекста не ясно какого же типа выражение.
С другой стороны, в определенных statement требуется знать тип выражения (хотя бы тот же case). В конце-концов я вводил понимание неявного преобразования типов в сам компилятор грамматики. Кстати, эта же пробелема будет практически у всех современных языков. Возможно, разве что, Ada с ее явными преобразованиями типов это не каснется (может, это и было причиной ввода обязательных явных преобразований?).
Попробую еще повспоминать.
Невозможность описания языка строго через грамматику сильно усложняет различные задачи проверки и конвертации программ. Так что это не просто блажь.
Вот это немного не относится к вопросу, но всегда мне приходит на ум как кривость синтаксиса Паскаля: почему case заканчивается на end? Как результат, синтаксис case отличается от синтаксиса if then else, особенно в части else. Нелогично.
Второе: почему в некоторых местах точку с запятой можно ставить, а можно и опускать? Это, кстати, может приводить к трудноуловимым ошибкам, как в том примере, что я привел ранее.
← →
SergP (2003-12-26 11:17) [21]Кстати вопрос (правда это не про if then else):
Почему компилятору в данном примере пофиг стоит точка с запятой или нет?:
...
private
{ Private declarations }
public
datb:array[1..5] of record
rajon:string[30];
data:array[1..12] of integer
end; // вот эта точка с запятой ему пофиг.....
{ Public declarations }
end;
...
← →
ИдиотЪ (2003-12-26 11:20) [22]Alex Konshin ©
а ты ставь везде точки с запятыми, кроме else )
а какие еще ошибки ?
ну только разве с кучей вложенных if и else, тут уж язык не причем
ПС
Не вини монитор, коли рука крива
← →
Alex Konshin (2003-12-26 11:23) [23]Семантика - это смысл программы. А длина идентификатора это все-таки чистый синтаксис. И как раз-таки здесь большой проблемы для отображения в БНФ нет.
← →
Sha (2003-12-26 11:26) [24]> Alex Konshin © (26.12.03 11:14) [20]
Приведение типов и не должно описываться БНФ.
То, синтаксис case отличается от синтаксиса if then else, мне тоже не нравится, но это не является неоднозачностью.
SergP © (26.12.03 11:17) [21]
Вирт почему-то решил, что begin и end не являются операторами, и значит, перед end и после begin точки с запятой необязательны.
← →
Alex Konshin (2003-12-26 11:30) [25]> Почему компилятору в данном примере пофиг стоит точка с запятой или нет?
Перед end ее можно не ставить.
Тоже бред - нашли на чем экономить. В итоге нельзя сказать, что "statement должен оканчиваться точкой с запятой". Тогда для того же описания в БНФ приходится придумывать какие-то суррогаты для того, чтобы нормально понимались обе конструкции:
begin
end;
и
begin
;
end;
И зачем?
← →
Alex Konshin (2003-12-26 11:42) [26]
Приведение типов и не должно описываться БНФ.
То, синтаксис case отличается от синтаксиса if then else, мне тоже не нравится, но это не является неоднозачностью
Я бы может и согласился бы с вами, но как тогда быть с конструкциями, где требуются определенные типы? Вы загляните в описание синтаксиса Pascal - там же есть термы вроде integer_expression. Вот я и говорю, те грамматики - липа, их нельзя скомпилировать как есть. То есть, не вводя какие-то контекстные зависимости в компилятор я не могу проверить соответствие входной программы синтаксису языка на этапе синтаксического разбора? Бред, не находите?
Только не надо меня агитировать за советскую власть, я все сам понимаю, я просто указываю на недостатки языка, какие присущи не только ему.
Кстати, с термом case вообще много интересого, например, синтаксис case в record отличается от синтаксиса statement case. Ну это-то нафига?
← →
Юрий Зотов (2003-12-26 11:45) [27]> Sha © (26.12.03 11:26) [24]
> Вирт почему-то решил, что begin и end не являются
> операторами
И очень логично решил. Оператор - это ИСПОЛНИМАЯ часть программы. А вegin и end - это НЕисполнимая часть. Просто информация для компилятора. Если говорить строго, то это часть СОСТАВНОГО оператора, или операторные скобки, как их еще называют.
<простой оператор> ::= <оператор присваивания>
<оператор if>
<оператор case>
<оператор while>
и т.д.
<список операторов> ::= <оператор>
<оператор> ; <список операторов>
<составной оператор> ::= begin <список операторов> end
<оператор> ::= <простой оператор>
<составной оператор>
Раскрутите это фрагмент систаксиса КЛАССИЧЕСКОГО Паскаля - и Вы сразу увидите ДЕЙСТВИТЕЛЬНЫЙ (а не кажущийся) смысл begin-end и semicolon. А также - где ставится и где НЕ ставится semicolon (кстати, c точки зрения СИНТАКСИСА, semicolon после begin или перед end - это однозначно пустой оператор и ничего полее).
← →
Anatoly Podgoretsky (2003-12-26 11:46) [28]Alex Konshin © (26.12.03 11:30) [25]
А если ты вспомнишь старые реализации Паскаля, то там нельзя было ставить точку с запятой перед end. Это более позднее послабление.
← →
Sha (2003-12-26 11:51) [29]Alex Konshin © (26.12.03 11:42) [26]
Мне кажется, что недостатков в грамматике всего 2:
- плохой case, ко всему сказанному выше я бы добавил обязательность begin/end в каждом условии;
- особый статус begin/end в группе операторов и соответствующие чудачества с точкой с запятой.
А термы вроде integer_expression присутствуют в описании любого языка. С этим надо смириться, как с дождем за окном. Это невозможно улучшить ни Вирту, ни вам.
← →
Юрий Зотов (2003-12-26 11:52) [30]Сорри, неточность допустил. Надо так:
<список операторов> ::= <простой оператор>
<простой оператор> ; <список операторов>
← →
Sha (2003-12-26 11:57) [31]Юрий Зотов © (26.12.03 11:45) [27]
Знаю я все про операторные скобки и про пустые операторы.
Посмотрите синтаксис Algol - там те же операторные скобки, но с точкой с запятой. Они также прекрасно раскручиваются. Зато в Алголе, как верно заметил Alex Konshin, любой оператор, включая операторные скобки, оканчивается точкой с запятой. Такие аксиомы легче понимаются и легче запоминаются. Плюс снимаются многие неоднозначности.
← →
Юрий Зотов (2003-12-26 12:12) [32]> Sha © (26.12.03 11:57) [31]
> любой оператор, включая операторные скобки
В том-то все и дело, что в Паскале операторные скобки ОПЕРАТОРАМИ не являются (см. синтаксис выше). Нет такого оператора - begin. И оператора end - тоже нет.
И это очень правильно, потому что оператор - это то, что можно исполнить. Исполнить же можно даже пустой оператор (NOP), а вот begin и end исполнить нельзя. Это всего лишь информация для компилятора, чистейший элемент СИНТАКСИСА. А не кода.
> оканчивается точкой с запятой
Зачем бездумно расставлять точки с запятой, где ни попадя? Тем более, зачем вводить это в СИНТАКСИС? Паскаль задумывался, как язык ОБУЧАЮЩИЙ и одной из ГЛАВНЫХ его задач было привитие хорошего СТИЛЯ. Что и было сделано (я бы сказал - с блеском).
> Такие аксиомы легче понимаются и легче запоминаются.
В таком случае легче всего понимается и запоминается старый Фортран: 1 строка - один оператор. И никаких проблем, и никаких точек с запятой. Но ведь почему-то этого ушли? Ушли. И вполне понятно, почему.
> Плюс снимаются многие неоднозначности.
Выше я привел элемент синтаксиса Паскаля. Где Вы видите в нем неоднозначности?
← →
Sha (2003-12-26 12:28) [33]> Юрий Зотов © (26.12.03 12:12) [32]
> Паскаль задумывался, как язык ОБУЧАЮЩИЙ и одной из ГЛАВНЫХ его
> задач было привитие хорошего СТИЛЯ.
А Алгол - не обучающий? Или программы на Алголе прививают плохой стиль? Сам я обучался программированию именно на Алголе. И помню, что вопросов по поводу точки с запятой тогда ни у кого не возникало. А при обучении программированию на Паскале этот вопрос возникает ПОСТОЯННО у КАЖДОГО обучающегося. Это плохо, это отвлекает от ГЛАВНОГО - ПРИВИТЯ ХОРОШЕГО СТИЛЯ.
Языки пишутся для людей, и то, что хорошо и логично для машины не всегда хорошо и логично дя человека. Вместо того, чтобы потратить время с большей пользой, КАЖДЫЙ преподаватель ВЫНУЖДЕН втолковывать КАЖДОМУ обучаемому (с его начальными и неокреншими знаниями) что про красоту и логичность БНФ Паскаля. Язык должен понравиться сразу, тогда обучение идет быстрее. А такие причуды Вирта этому только мешают.
> Где Вы видите в нем неоднозначности?
Неоднозначности в интерпретации БНФ, как я уже говорил, нет. Есть неоднозначность в интерпретации кода, написанного другим программистом, если подобные конструкции языка сам никогда не используешь. На одну из них указал Alex Konshin © (26.12.03 09:56) [7]
← →
Иван Шихалев (2003-12-26 12:34) [34]В Паскале операторы вообще не оканчиваются точкой с запятой, они ей разделяются.
← →
PVOzerski (2003-12-26 12:36) [35]IMHO, ничего плохого в этой самой точке с запятой нет. Пример с case ... if .. else - блестящий! Меня лично в Паскале коробит только одна вещь: часть предопределенных процедур сделана не в соответствии с синтаксисом самого же Паскаля. А ну-ка, напишите функцию, которую можно было вызывать с произвольным числом параметров нескольких типов, как write/writeln/read/readln! Не принимаю предложения ни об array of const (поскольку придется квадратные скобки привлекать), ни о default (поскольку число параметров уже не совсем произвольно), ни об overload (по той же причине) :^) 2-я задача: аналогично тем же write/writeln (а у Borland - еще и str), сделать поддержку "форматного двоеточия" с тем же синтаксисом.
← →
Sha (2003-12-26 12:36) [36]Иван Шихалев © (26.12.03 12:34) [34]
Ну да, а предложения разделяются точками :)
← →
Igorek (2003-12-26 12:40) [37]пятница - holywars
← →
MOA (2003-12-26 12:46) [38]Почему же нельзя, запросто. Например (специально без отступов):
if i > 2 then
if j < 3 then
k:=i+j; // < пожалуйста, ; пред else в полный рост
else
k:=i-j;
← →
Думкин (2003-12-26 12:49) [39]> [37] Igorek © (26.12.03 12:40)
Угу. Предпоследнее HolyWar уходящего года.
← →
Sha (2003-12-26 12:50) [40]MOA © (26.12.03 12:46) [38]
Не пойдет компияция.
← →
MOA (2003-12-26 12:53) [41]2Sha
А вы попробуйте, попробуйте. И в чём отличие от
if i > 2 then
if j < 3 then
k:=i+j //< без ;
else
k:=i-j;
← →
Sandman25 (2003-12-26 12:54) [42][38] MOA © (26.12.03 12:46)
[Error] Unit1.pas(30): ";" not allowed before "ELSE"
← →
Sha (2003-12-26 12:56) [43]MOA © (26.12.03 12:53) [41]
Версия Delphi?
← →
blackman (2003-12-26 12:58) [44]А все так хорошо начиналось :) С Semicolon :)
К стати помню, что приходилось ее перфорировать как ., потому, что не было на клавиатуре ;
Однако на каком устройстве уже не помню :)
Может кто вспомнит ?
А вообще-то лучше Algol60 в мире нет и не было языка :)
Вперед в прошлое!
← →
Юрий Зотов (2003-12-26 13:00) [45]> Sha © (26.12.03 12:28) [33]
> А Алгол - не обучающий?
Нет. Изначально, Алгол - это метаязык. Язык описания алгоритмов. Нечто вроде БНФ, только из несколько другой оперы. И задумывался он именно как средство накопления библиотек алгоритмов. Это уж потом с него написали компиляторы и он стал ПРАКТИЧЕСКИМ языком.
> Это плохо, это отвлекает от ГЛАВНОГО - ПРИВИТЯ ХОРОШЕГО СТИЛЯ.
Это ХОРОШО, потому что ГЛАВНАЯ часть ХОРОШЕГО стиля - это как раз ПОСТОЯННО думать, а не лепить символы на автопилоте и со скоростью хорошей машинистки. Кстати, все проблемы исчезают после пары недель упражнений, а вот привычка ДУМАТЬ - остается.
> Языки пишутся для людей
А еще они пишутся для РАЗНЫХ людей и с РАЗНЫМИ целями.
> Вместо того, чтобы потратить время с большей пользой, КАЖДЫЙ
> преподаватель ВЫНУЖДЕН втолковывать КАЖДОМУ обучаемому (с его
> начальными и неокреншими знаниями
И особенно хорош в этом плане замечательный язык C (впрочем, ладно, не о нем речь). Где ставить, а где не ставить точку с запятой, мне стало АБСОЛЮТНО понятно после прочтения всего лишь одного абзаца в простенькой книжке. Если же преподаватель не может втолковать это студентам, то... или такие студенты, или такой преподаватель.
> Есть неоднозначность в интерпретации кода, написанного другим
> программистом, если подобные конструкции языка сам никогда не
> используешь.
Если у музыканта возникают проблемы в понимании партитуры, написанной другим музыкантом, то... то он просто плохо знает нотную грамоту. И ничего более. Ноты здесь, честное слово, ни при чем.
> Иван Шихалев © (26.12.03 12:34) [34]
Совершенно верно. Точка с запятой НЕ является частью оператора.
← →
MOA (2003-12-26 13:04) [46]Блин! Точно. Вот это да! И почему это я на эти грабли не разу не наступил за всё это время?
Мои извинения всё честной компании. Виноват.
Будем думать, почему нельзя.
← →
blackman (2003-12-26 13:12) [47]>Алгол - это метаязык. Язык описания алгоритмов
Стало быть на всех остальных алгоритм не запишешь :)
http://osp.admin.tomsk.ru/cw/1999/45/38.htm
http://privatjc.chat.ru/algol/
← →
Nous Mellon (2003-12-26 13:17) [48]
> Угу. Предпоследнее HolyWar уходящего года
А вы уже последнее наметили? :)
← →
Ну вы поняли мужики (2003-12-26 13:19) [49]subj
а оно тебе надо?
← →
Sha (2003-12-26 13:24) [50]> Юрий Зотов © (26.12.03 13:00) [45]
> Алгол - это метаязык. Язык описания алгоритмов.
Вот-вот. Поэтому на нем удобно вести обучение написанию алгоритмов.
> Это ХОРОШО, потому что ГЛАВНАЯ часть ХОРОШЕГО стиля - это как раз ПОСТОЯННО думать.
Некоторым может не нравится постоянно думать, обходя каждый камень на пути. Гораздо лучше, когда все камни убраны с твоей дороги. Предпочитаю думать о ГЛАВНОМ :)
>> Языки пишутся для людей
>А еще они пишутся для РАЗНЫХ людей и с РАЗНЫМИ целями.
Тут я согласен. И в обучащем языке соломки могло бы быть и побольше.
> Где ставить, а где не ставить точку с запятой, мне стало
> АБСОЛЮТНО понятно после прочтения всего лишь одного абзаца в
> простенькой книжке. Если же преподаватель не может втолковать
> это студентам, то... или такие студенты, или такой преподаватель.
Так и всем нормальным людям тоже. Я о другом. Дети пользуются выключателем не задумываясь об электронах. Они узнают об этом позже. Почемы бы не перенести эту концепцию на язык?
> Если у музыканта возникают проблемы в понимании партитуры,
> написанной другим музыкантом, то... то он просто плохо знает
> нотную грамоту. И ничего более. Ноты здесь, честное слово, ни
> при чем.
Опять не об этом. Речь даже не сомнении, а о тени сомнения.
По хорошей программе взляд должен скользить как по детективу, она должна быть написана так, чтобы смысл доходил легко, без запинок. Ноты здесь действительно ни причем :) Но не каждый пианист всякую партитуру сбацает.
>Точка с запятой НЕ является частью оператора.
А "операторные скобки ОПЕРАТОРАМИ не являются". Очевидные истины не требуется повторять. Это может раздражать оппонента. Если бы я книгу писал, то думал бы над каждым словом. А здесь по контексту понятно, что имеется ввиду. Тем более Вам.
← →
Igorek (2003-12-26 13:42) [51]Помню как переходил с С++ на Паскаль. Матерился - через оператор. В С++ все очевидно и просто. А в гребаном Паскале то ставь, то не ставь ";". Потом привык. Даже некоторые плюсы нашел. Хотя все равно имхо Паскаль масдай. Так что все - дело привычки. А любой алгоритм как говорится можно на любом языке написать.
Кстати была у меня идея-фикс. Почему нельзя позволить программисту самому определять грамматику языка. Или хотя бы ее корректировать. Напр. не нравится begin end - пиши {}. И не макросом заменять, а где-то галочку в опциях поставить. Т.е. программист строит свою грамматику, в ней пишет, в ней и читает код коллег.
← →
ИдиотЪ (2003-12-26 13:49) [52]Igorek ©
можно, для этого есть предтрансляторы
← →
Digitman (2003-12-26 14:03) [53]
> Igorek © (26.12.03 13:42) [51]
> Почему нельзя позволить программисту самому определять грамматику
> языка. Или хотя бы ее корректировать
очевидно, по той же причине, что и непозволительно просто человеку (не программисту - просто индивидууму в социуме) взять за правило вместо
Я ИДУ В КИНОТЕАТР
говорить
Я , на..., ИДУ , на...,В КИНОТЕАТР , на...,
лишь по той причине, что "в ней пишет, в ней и читает"
← →
Думкин (2003-12-26 14:03) [54]
> [48] Nous Mellon © (26.12.03 13:17)
Нет, просто предпоследних- уже несколько. К тому же есть еще Рабочие дни 29,30 - найдется кто опять разведет войнушку и хихикать будет. Опыт. :))
← →
Sha (2003-12-26 14:05) [55]Всех с будущим и прошедшим праздником. Мы продолжаем праздновать :)
← →
Думкин (2003-12-26 14:09) [56]
> [51] Igorek © (26.12.03 13:42)
> Помню как переходил с С++ на Паскаль. Матерился - через
> оператор. В С++ все очевидно и просто. А в гребаном Паскале
> то ставь, то не ставь ";". Потом привык. Даже некоторые
> плюсы нашел. Хотя все равно имхо Паскаль масдай.
Нет, это LMD.
← →
Igorek (2003-12-26 14:47) [57]
> Думкин © (26.12.03 14:09) [56]
> Нет, это LMD.
Иной реакции я и не ожидал. :)))
Или ты имел ввиду Lamer (Virt) Must Die?
← →
DiamondShark (2003-12-26 15:07) [58]
> Синтаксис плохой. Я вообще не понимаю назначение -> ;
> В VB такого нет и все работает нормально.
Запяточие -- разделитель операторов.
В ВБ синтаксис фуфло. Там символ конца строки считается значимым.
В Паскале синтаксис свободный.
← →
Yanval (2003-12-26 16:01) [59]>Игорёк
Ну, никто-же не материт С, например за то, что вместо точки ставится стрелка, хотя тоже трудно при переходе. Если паскаль кому-то сложен это ещё не повод для его смерти.
← →
uw (2003-12-26 16:21) [60]>Sha © (26.12.03 11:57) [31]
В Алголе-60 begin и end - не операторные скобки, а ограничители блока. Это, в частности, означает, что после if ... then begin могут следовать описания переменных, и только потом - операторы. Кроме того, текст после end вплоть до ; воспринимается компилятором как комментарий. У Паскаля структура другая, а компиляторы быстрые. И это хорошо.
← →
uw (2003-12-26 16:25) [61]А C мне тоже нравится. Правда, я на нем писал только программы для контроллеров, никаких неудобств при этом не испытывал.
← →
REA (2003-12-26 16:46) [62]А вот такое:
If A Then
If B Then DoSomethingAB;
Else
DoSomethingNotA
Это ; перед else? Обязан ли я ставить Begin End?
← →
Юрий Зотов (2003-12-26 19:04) [63]Ну, что ж, начнем отвечать, по порядку.
> MOA © (26.12.03 13:04) [46]
Совершенно ясно, что это просто ошибка в лексическом блоке компилятора. И так же совершенно ясно, что она имеет отношение к конкретной РЕАЛИЗАЦИИ языка, но не к самому языку.
> blackman © (26.12.03 13:12) [47]
>>Алгол - это метаязык. Язык описания алгоритмов
> Стало быть на всех остальных алгоритм не запишешь
Потрясающая логика. No comments. За исключением одного - при цитировании Вы опутили слово "ИЗНАЧАЛЬНО". А зря. Оно ключевое.
Что же касается приведенных Вами ссылок, то первая из них моего утверждения не опровергает, а вторая - подтверждает его:
history: Originally created in 1960 as an abstract language for describing algorithms.
Строгости ради следует добавить, что и утвержение это - вовсе не мое. Его можно найти чуть ли не в любой книжке по алголу.
> Sha © (26.12.03 13:24) [50]
> Поэтому на нем удобно вести обучение написанию алгоритмов.
Да. Потому что он именно для этого и разрабатывался. На нем можно обучать и практическому программированию - потому что он хорошо структурирован и пр. Но все же запись алгоритма на некоем абстрактном языке (каким первоначально и был Алгол) и написание практической программы - вещи несколько разные. И вот как раз для второго Паскаль подходит лучше. И тоже потому что он именно для этого и разрабатывался.
> Некоторым может не нравится постоянно думать, обходя каждый
> камень на пути. Гораздо лучше, когда все камни убраны с твоей
> дороги
Вы, вероятно, имели дело с PL/1, который даже на уровне декларации самого языка УЖЕ допускал практически свободное преобразование любых типов данных в любые другие, смешение их в одном выражении и пр. Все камни убраны, не правда ли? Но вот как раз для ОБУЧЕНИЯ это, согласитесь, просто ужасно. Хуже трудно придумать - и в смысле прививания СТИЛЯ это ПРИНЦИПИАЛЬНЫЙ недостаток. А паскалевские "камни" (то бишь точки с запятыми), во-первых, вовсе не принципиальны, а во-вторых вообще перестают быть камнями через пару недель практики. И никаких проблем.
> Дети пользуются выключателем не задумываясь об электронах.
> Они узнают об этом позже. Почемы бы не перенести эту
> концепцию на язык?
Уже перенесли - и получился бейсик. Потом, правда, выяснилось, что как раз для обучения он плох - прививает скверный стиль. Почему так получилось? Вероятно, потому, что во всем надо знать меру - в том числе, и в упрощении языка. Продолжая Ваше сравнение - дети пользуются выключателем, не задумываясь об электронах, но все же задумываясь о том, какой выключатель включает какую лампочку и куда его нужно щелкать - вверх или вниз. Правда, через пару дней они привыкают и задумываться уже перестают - то же самое и с Паскалем. А электроны - это уже коды и ассемблер. Совсем другая опера.
> По хорошей программе взляд должен скользить как по детективу,
> она должна быть написана так, чтобы смысл доходил легко, без
> запинок.
Совершенно верно. И если программу пишет грамотный программист, то он именно так и напишет, на любом языке. В том числе, и на Паскале. Но если другой программист мучается с ее прочтением (о чем Вы первоначально и говорили) - сорри, он просто плохо знает язык. Но не язык в этом виноват, уверяю Вас (даже если говорить о Си с его заморочками). И уж что-что, а хорошо написанные Паскаль-программы как раз абсолютно ясны и прозрачны. Если знать Паскаль, конечно.
> А "операторные скобки ОПЕРАТОРАМИ не являются".
> Очевидные истины не требуется повторять
Я не считал, что эта истина для Вас очевидна - исходя из Ваших же собственных слов:
Sha © (26.12.03 11:26) [24]
Вирт почему-то решил, что begin и end не являются операторами,
и значит, перед end и после begin точки с запятой необязательны.
Поэтому я и хотел пояснить трактовку begin-end в Паскале. Если она и без того для Вас очевидна, то, конечно, старался я зря - но ведь тогда Вы противоречите сами себе.
> REA © (26.12.03 16:46) [62]
> Обязан ли я ставить Begin End?
Согласно определению самого языка - не обязаны. Но, как выяснилось, в его Delphi-реализации есть погрешность, поэтому в Delphi-программе - обязаны.
← →
blackman (2003-12-26 19:46) [64]>Потрясающая логика. No comments. За исключением одного - при >цитировании Вы опутили слово "ИЗНАЧАЛЬНО"
А изконечно уже нет ? :)
Изначально предполагалось, что это один из алгоритмических языков.
И потом, неужели вы не поняли шутки ?
Я так не играю :)
← →
Sha (2003-12-26 19:46) [65]> Юрий Зотов © (26.12.03 19:04) [63]
1. Уж очень серьезно вы относитесь ко всем репликам в "потрепаться". Я бы и сам подписался под некоторыми из ваших ответов, но в иной ситуации. А среди, я надеюсь, единомыщленников, принят несколько иной тон.
2. Есть несколько замечаний к Вашей манере вести дискуссии. Вы ведь не думаете, что знаете все лучше всех? Я, например, уверен в обратном, но не демонстрирую этого.
3. Есть такой 100%-выигрышный способ завалить оппонента. Сначала приписать ему нечто, чего он не говорил, а потом разгромить с треском эту позицию. Не хочу сказать, что Вы пользуетесь этим приемом, но иногда подходите к нему очень близко.
С наилучшими пожеланиями,
Александр Шарахов.
← →
Petr V. Abramov (2003-12-26 20:43) [66]Юрий Зотов © (26.12.03 11:52) [30]
Так все-таки не надо :) - так получается, что список операторов обязан начинаться с простого оператора. В [27] как раз было лучше. Насчет бесконечной рекурсии определения, которой Вы, скорее всего, испугались - реально ее нет, и [27] раскручивается на ура, я даже офигел, насколько естественным образом это получается
← →
Юрий Зотов (2003-12-26 21:25) [67]> Petr V. Abramov © (26.12.03 20:43) [66]
Согласен. Я потом и сам же об этом же подумал, но поленился еще раз исправлять, да и не столь это важно для ветки. Пожалуй, первоначальный вариант действительно верен, только надо ввести еще пустой список (через пустую цепочку - в теории ее обычно обозначают буквой "эпсилон"):
<список операторов> ::= <пустая цепочка>
<оператор>
<оператор> ; <список операторов>
> Sha © (26.12.03 19:46) [65]
Видимо, я просто задира. Мир?
:о)
← →
Sha (2003-12-26 21:51) [68]Юрий Зотов © (26.12.03 21:25) [67]
OK, мир
← →
Petr V. Abramov (2003-12-26 22:03) [69]Юрий Зотов © (26.12.03 21:25) [67]
Тогда уж пустой оператор, иначе ( что относительно важно для ветки :) не получится глупая, но синтаксически верная конструкция
if true then
else ;
← →
Иван Шихалев (2003-12-26 22:27) [70]1-н момент.
Во-первых, средней паршивости профессионалу давно насрать на каком языке писать - есть "студенты" пусть они и пишут.
Во-вторых, готов спорить со всякими любителями C (или другого языка общего назначения) что одинаковую задачу решу примерно в то же время, что и оппонент на C. Готов спорить даже, что при решениии задачи на вашем занюханном диалеките - мне понадобится не больше месяца от решения специалиста по вашему занюхануму.
PS. Менее 10 бутылок коньяка - не интересует.
← →
Юрий Зотов (2003-12-26 22:52) [71]> Sha © (26.12.03 21:51) [68]
:о)
> Petr V. Abramov © (26.12.03 22:03) [69]
Все же не так. Пустой список - он и есть пустой список. Пример:
begin
// И никаких точек с запятыми - вообще ничего, кроме этого
// комментария, который, естественно, игнорируется.
end
А пустой оператор - это <простой оператор>, точно такой же как и все остальные:
...
<оператор while> ::= while <условие> do <оператор>
<пустой оператор> ::= ;
<простой оператор> ::= ...
<оператор while>
<пустой оператор>
И все раскручивается само собой.
← →
Petr V. Abramov (2003-12-27 01:37) [72]> Юрий Зотов © (26.12.03 22:52) [71]
Если < пустой оператор > - это < простой оператор >, то пустой список естественным образом определяется через него, и специального определения не требуется ( что не делает неверным [67]).
Но все равно в [71] есть "не так"! :)
<пустой оператор>" - это не semicolon! Иначе конструкция
if <condition> then <пустой оператор> else <оператор>
выглядит как if false then ; else ; и получаем заголовок ветки :)
<пустой оператор> ::= <ничего нет>, где
<ничего нет> ::= <разделители и комментарии> (которые тоже являются частью входного потока, и, соответственно, языка)
P.S. Извини за занудство :)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.69 MB
Время: 0.011 c