Alexander Galanin <[email protected]> writes: > On Tue, 03 Dec 2013 03:47:36 +0100 > "Alexander Wiedergold WIEDERGOLD.NET" <[email protected]> wrote: > >> Когда if и then располагаются в одной строке, то конструкция if должна >> завершаться точкой с запятой. И if, и then -- это зарезервированные >> слова. Зарезервированные слова начинают инструкцию, которая должна быть >> завершена прежде, чем в той же строке появится новая инструкция. > > «if bebebe then» - команда «if» с аргументами «bebebe» и «then». > «if bebebe; then» — команда «if» с аргументом «bebebe», после неё идёт > команда «then». > > И почитайте какую-нибудь книжку, а не из головы придумывайте правила.
Ну, если учитывать предыдущий абзац, то Вы тоже из головы придумываете
правила, потому что if - не "команда" с аргументами. Не то, чтобы это
камень в Ваш огород, просто экскурс...
Так вот, конструкция if-then-else ведёт свою родословную от языка
lisp. В классическом варианте она описывается следующем образом:
(if test-form then-form [ else-form ])
Отличие от функций ("команд") заключается в том, что в результате
нормального порядка вычислений параметры функций вычисляются до того,
как будут переданы в процедуру, что в случае с конструкцией if
неприменимо. Таким образом if - так называемая особая форма, то есть её
параметры обрабатываются отлично от параметров функций.
Теперь же надо дать интерпретатору понять, где у нас какой параметр
расположен. Для этого и применяются зарезервированные слова then и else.
Что же касается совершенно справедливого вопроса о необходимости точки с
запятой перед if. Всё дело в том, что любой из трёх параметров может
быть представлен как одной командой, так и блоком команд. А команды в
shell, как известно, отличаются точкой с запятой, либо переводом строки.
Следовательно в многострочном варианте if точка с запятой не нужна,
потому что команды разделяются переводом строки, в отличие от
однострочного.
Поэтому, Александру Въедерголду (надеюсь, правильно написал), я хотел бы
дать понять, что точкой с запятой завершается не if, а команда(ы),
которая(ые) следует(ют) за if.
А Александру Галагину я хотел бы заметить, что:
«if bebebe then ...» - команда bebebe с аргументом then
«if bebebe; then ...» - команда bebebe без аргументов в качестве первого
аргумента особой формы if (предиката), и начало следующего аргумента
особой формы if.
Чтобы не быть голословным, вот несколько примеров для размышлений:
--------------------
% if true; then echo T; else echo NIL; fi
T
% if false; then echo T; else echo NIL; fi
NIL
% if false; true; then echo T; else echo NIL; fi
T
% if echo then; then echo Hooray; fi
then
Hooray
--------------------
pgpWNly2pGHTM.pgp
Description: PGP signature

