26.6 Парсинг выражений Loop

The syntactic parts of a loop construct are called clauses; the scope of each clause is determined by the top-level parsing of that clause’s keyword. The following example shows a loop construct with six clauses:

Синтаксические части конструкции loop называются выражениями. Область действия каждого выражения определяется парсером данного типа выражения. Следующий пример показывает loop с шестью выражениями:

(loop for i from 1 to (compute-top-value)         ;First clause
      while (not (unacceptable i))                ;Second clause
      collect (square i)                          ;Third clause
      do (format t "Working on ~D now" i)         ;Fourth clause
      when (evenp i)                              ;Fifth clause
        do (format t "~D is a non-odd number" i)
      finally (format t "About to exit!"))        ;Sixth clause

(loop for i from 1 to (compute-top-value)         ;Первое выражение
      while (not (unacceptable i))                ;Второе
      collect (square i)                          ;Третье
      do (format t "Обрабтка ~D " i)         ;Четвёртое
      when (evenp i)                              ;Пятое
        do (format t "~D чётное" i)
      finally (format t "Почти у выхода!"))        ;Шестое

Each loop keyword introduces either a compound loop clause or a simple loop clause that can consist of a loop keyword followed by a single Lisp form. The number of forms in a clause is determined by the loop keyword that begins the clause and by the auxiliary keywords in the clause. The keywords do, initially, and finally are the only loop keywords that can take any number of Lisp forms and group them as if in a single progn form.

Каждое ключевое слово представляет или составное выражение, или простое выражение, которое может состоять из этого ключевого слова и одиночное Lisp’овой формы. Количество форм в выражении определяется первым ключевым символом или вспомогательными ключевыми символами в выражении. Только такие ключевые символы, как do, initially и finally, могут принимать любое количество Lisp’овых форм и группировать в одиночную форму progn.

Loop clauses can contain auxiliary keywords, which are sometimes called prepositions. For example, the first clause in the preceding code includes the prepositions from and to, which mark the value from which stepping begins and the value at which stepping ends.

Выражения loop могут содержать вспомогательные ключевые символы, которые иногда называются предлоги. Например, первое выражение в предыдущем коде включает предлоги from и to, которые указывают на начальное и конечное значения для переменной.

26.6.1 Order of Execution

26.6.2 Порядок вычисления

With the exceptions listed below, clauses are executed in the loop body in the order in which they appear in the source. Execution is repeated until a clause terminates the loop or until a Common Lisp return, go, or throw form is encountered. The following actions are exceptions to the linear order of execution:

Выражения в теле loop вычисляются в том порядке, в котором задал пользователь, с некоторыми исключениями перечисленными ниже. Вычисление повторяется пока не сработает выражение, завершающее цикл, или не будет вызвана одна из Common Lisp’овых форм return, go, throw. Для последовательного выполнения существуют следующие исключения:

26.6.3 Kinds of Loop Clauses

26.6.4 Разновидности Loop выражений

Loop clauses fall into one of the following categories:

Выражения делятся на следующие категории:

26.6.5 Loop Syntax

26.6.6 Синтаксис Loop

The following syntax description provides an overview of the syntax for loop clauses. Detailed syntax descriptions of individual clauses appear in sections 26.12 through 26.23. A loop consists of the following types of clauses:

initial-final ::= initially | finally
variables ::= with | initial-final | for-as | repeat
main ::= unconditional | accumulation | conditional | termination | initial-final
loop ::= (loop [named name] {}* variables {}* main)

Вот небольшой обзор синтаксиса для выражений цикла. Детальные описания конкретных подвыражений находятся в разделах начиная с 26.12 и заканчивая 26.23. Цикл содержит следующие типы выражений:

initial-final ::= initially | finally
variables ::= with | initial-final | for-as | repeat
main ::= unconditional | accumulation | conditional | termination | initial-final
loop ::= (loop [named name] {}* variables {}* main)

Note that a loop must have at least one clause; however, for backward compatibility, the following format is also supported:

(loop {tag | expr}* )

where expr is any Common Lisp expression that can be evaluated, and tag is any symbol not identifiable as a loop keyword. Such a format is roughly equivalent to the following one:

(loop do {tag | expr}* )

Заметьте, что цикл должен содержать как минимум одно выражение, однако для обратной совместимости также поддерживается и следующий формат:

(loop {tag | expr}* )

где expr является любым Common Lisp’овым выражением, которое может быть вычислено, и tag это любой символ не из множества символов loop. Такой формат примерно эквивалентен следующему:

(loop do {tag | expr}* )

A loop prologue consists of any automatic variable initializations prescribed by the variable clauses, along with any initially clauses in the order they appear in the source.

Пролог состоит из инициализации переменных описанных в соответствующих выражения, и initially выражений в том порядке, в котором они были записаны.

A loop epilogue consists of finally clauses, if any, along with any implicit return value from an accumulation clause or an end-test clause.

Эпилог состоит из выражений finally (если они были), и неявного возврата значения из выражений собирающих результат или из выражений проверки выхода из цикла.