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 --------------------
pgpWNly2pGHTM.pgp
Description: PGP signature