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

Вниз

; 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;
Скачать: CL | DM;

Наверх




Память: 0.72 MB
Время: 0.047 c
3-63026
BlackTiger
2003-12-21 22:38
2004.01.20
Глюки грида DeveloperExpress4? Или как?


3-63030
senya
2003-12-22 12:55
2004.01.20
Как определить существует ли таблица в базе FireBird.


14-63365
Dolot
2003-12-29 00:30
2004.01.20
Работа с systray ем


14-63347
Clift
2003-12-30 01:41
2004.01.20
string+Image=ОДИН файл


14-63386
Netjp
2003-12-29 02:14
2004.01.20
Надоел сайт... вот думаю закрыть или оставить...