Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.013 c
1-63057
Кен
2003-12-31 01:06
2004.01.20
Как преобразовать имя из C: МОИ ДОКУМЕНТЫ в C: Мои документы ?


1-63238
Dimmu Borgir
2004-01-09 11:36
2004.01.20
Rgn


1-63252
Maxkat
2004-01-08 19:53
2004.01.20
WinExec, проблема с ненужным копированием файлов


3-63041
gleb
2003-12-22 08:49
2004.01.20
DBGRID


1-63235
Ivolg
2004-01-09 11:53
2004.01.20
Второстепенные формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский