Alexander Galanin <a...@galanin.nnov.ru> writes:

> On Tue, 03 Dec 2013 03:47:36 +0100
> "Alexander Wiedergold WIEDERGOLD.NET" <wiederg...@web.de> 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
--------------------

Attachment: pgpWNly2pGHTM.pgp
Description: PGP signature

Ответить