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, которые указывают на
начальное и конечное значения для переменной.
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. Для последовательного выполнения существуют следующие
исключения:
- All variables are initialized first, regardless of where the establishing
clauses appear in the source. The order of initialization follows the order
of these clauses.
- Перво-наперво выполняется инициализация всех переменных,
вне зависимости от их позиции в исходном коде. Порядок
инициализации сохраняется.
- The code for any initially clauses is collected into one progn in
the order in which the clauses appear in the source. The collected
code is executed once in the loop prologue after any implicit variable
initializations.
- Код из всех initially выражений в исходном порядке собирается
в один большой progn. Собранный код вычисляется единожды в
прологе после инициализации всех переменных.
- The code for any finally clauses is collected into one progn in the
order in which the clauses appear in the source. The collected code is
executed once in the loop epilogue before any implicit values from the
accumulation clauses are returned. Explicit returns anywhere in the
source, however, will exit the loop without executing the epilogue code.
- Код для всех finally выражение в исходном порядке собирается
в один большой progn. Собранный код вычисляется единожды
в эпилоге, перед тем как будут неявно возвращены значения из
цикла. Однако явный выход где-либо в исходнике, будет завершать
цикл без выполнения эпилога.
- A with clause introduces a variable binding and an optional initial
value. The initial values are calculated in the order in which the with
clauses occur.
- with выражение обозначает связывание переменной и опционально
первоначальное значение. Первоначальные значение вычисляются
в исходном порядке.
- Iteration control clauses implicitly perform the following actions:
- initializing variables
- stepping variables, generally between each execution of the loop
body
- performing termination tests, generally just before the execution
of the loop body
- Выражения для итераций неявно выполняют следующие действия:
- присваивание переменных
- наращивание переменных на каждой итерации
- проверка условия завершения цикла, обычно перед
выполнение итерации
Loop clauses fall into one of the following categories:
Выражения делятся на следующие категории:
- variable initialization and stepping
- инициализация и пошаговое изменение
- The for and as constructs provide iteration control clauses that
establish a variable to be initialized. You can combine for and as
clauses with the loop keyword and to get parallel initialization
and stepping.
- Конструкции for и as служат для установки переменных. Для
параллельной инициализации и изменения, выражения for и
as могут комбинироваться с помощью символа and.
- The with construct is similar to a single let clause. You can
combine with clauses using and to get parallel initialization.
- Конструкция with похожа на выражение let.
Для параллельной инициализации вы можете комбинировать
with с помощью and.
- The repeat construct causes iteration to terminate after a
specified number of times. It uses an internal variable to keep track
of the number of iterations.
- Конструкция repeat указывает на количество итераций. Она
использует внутреннюю переменную для подсчёта шагов.
You can specify data types for loop variables (see section 26.23.2). It is an
error to bind the same variable twice in any variable-binding clause of a
single loop expression. Such variables include local variables, iteration
control variables, and variables found by destructuring.
Вы можете указать типы данных для переменных циклы (смотрите
раздел 26.23.2). Связывать переменные два раза в одном цикле
нельзя. Такие переменные включают локальные переменные,
переменные для управления циклом и переменные созданные при
деструктуризации.
- value accumulation
- накопление значения
- The collect construct takes one form in its clause and adds the
value of that form to the end of a list of values. By default, the
list of values is returned when the loop finishes.
- Конструкция collect принимает одну форму и добавляет
значение этой формы в конец списка значений. По-умолчанию
в конце цикла этот список возвращается.
- The append construct takes one form in its clause and appends
the value of that form to the end of a list of values. By default,
the list of values is returned when the loop finishes.
- Конструкция append принимает одну форму и добавляет
значение этой формы в конец списка значений. По-умолчанию
в конце цикла этот список возвращается.
- The nconc construct is similar to append, but its list values
are concatenated as if by the Common Lisp function nconc. By
default, the list of values is returned when the loop finishes.
- Конструкция nconc похожа на
append, но список соединяется с помощью функции nconc.
По-умолчанию в конце цикла этот список возвращается.
- The sum construct takes one form in its clause that must evaluate
to a number and adds that number into a running total. By
default, the cumulative sum is returned when the loop finishes.
- Конструкция sum принимает одну форму, которая должна
вернуть число, и добавляет это число в общую сумму.
По-умолчанию накопленная сумма возвращается из цикла.
- The count construct takes one form in its clause and counts the
number of times that the form evaluates to a non-nil value. By
default, the count is returned when the loop finishes.
- Конструкция count принимает одну форму и подсчитывает
сколько раз эта форма вернула не-nil значение. По-умолчанию
это количество возвращается из цикла.
- The minimize construct takes one form in its clause and
determines the minimum value obtained by evaluating that form.
By default, the minimum value is returned when the loop finishes.
- Конструкция minimize принимает одну форму и сохраняет
минимальное значение, которое вернула эта
форма. По-умолчанию, минимальное значение возвращается
из цикла.
- The maximize construct takes one form in its clause and
determines the maximum value obtained by evaluating that form.
By default, the maximum value is returned when the loop finishes.
- Конструкция maximize принимает одну форму и сохраняет
максимальное значение, которое вернула эта
форма. По-умолчанию, максимальное значение возвращается
из цикла.
- termination conditions
- условия для завершения
- The loop-finish Lisp macro terminates iteration and returns any
accumulated result. If specified, any finally clauses are evaluated.
- Lisp’овые макрос loop-finish прекращает цикл и возвращает
накопленный результат. Вычисляется выражение finally, если
было указано.
- The for and as constructs provide a termination test that is
determined by the iteration control clause.
- Конструкции for и as завершают цикл после выполнения
указанных условий.
- The repeat construct causes termination after a specified number
of iterations.
- Конструкция repeat завершает цикл после выполнения
указанного количества итераций.
- The while construct takes one form, a condition, and terminates
the iteration if the condition evaluates to nil. A while
clause is equivalent to the expression (if (not condition)
(loop-finish)).
- Конструкция while принимает одну форму — условие, и
завершает цикл когда условие возвращает nil. Выражение
while эквивалентно (if (not condition) (loop-finish)).
- The until construct is the inverse of while; it terminates
the iteration if the condition evaluates to any non-nil value.
An until clause is equivalent to the expression (if condition
(loop-finish)).
- Конструкция until антоним конструкции while. Она
завершает цикл, когда условие возвращает не-nil значение.
Выражение until эквивалентно (if condition (loop-finish)).
- The always construct takes one form and terminates the loop
if the form ever evaluates to nil; in this case, it returns nil.
Otherwise, it provides a default return value of t.
- Конструкция always принимает одну форму и завершает
цикл, если форма возвращает nil, в этом случае возвращается
nil. Иначе возвращается результат по-умолчанию t.
- The never construct takes one form and terminates the loop if
the form ever evaluates to non-nil; in this case, it returns nil.
Otherwise, it provides a default return value of t.
- Конструкция never принимает одну форму и завершает цикл,
если форма возвращает nil, в этом случае возвращается nil.
Иначе возвращается результат по-умолчанию t.
- The thereis construct takes one form and terminates the loop if
the form ever evaluates to non-nil; in this case, it returns that
value.
- Конструкция thereis принимает одну форму и завершает
цикле, если форма возвращает не-nil, в этом случае
возвращается значение формы.
- unconditional execution
- безусловное выполнение
- The do construct simply evaluates all forms in its clause.
- Конструкция do просто выполняет все переданные формы.
- The return construct takes one form and returns its value. It is
equivalent to the clause do (return value).
- Конструкция return принимает одну форму и возвращает её
значение. Эквивалентное выражение do (return value).
- conditional execution
- условное выполнение
- The if construct takes one form as a predicate and a clause that
is executed when the predicate is true. The clause can be a value
accumulation, unconditional, or another conditional clause; it can
also be any combination of such clauses connected by the loop
keyword and.
- Конструкция if принимает форму в качестве предиката
и выражение, которое выполняется в случае истинности
предиката. Выражение может быть накоплением значения,
безусловным или другим условным выражением.
- The when construct is a synonym for if.
- Конструкция when это синоним для конструкции if.
- The unless construct is similar to when except that it
complements the predicate; it executes the following clause if the
predicate is false.
- Конструкция unless похожа на when кроме того, что она
выполняет форму при условии что предикат ложен.
- The else construct provides an optional component of if, when,
and unless clauses that is executed when the predicate is false.
The component is one of the clauses described under if.
- Конструкция else содержит компонент, который будет
выполнен при невыполнении веток if, when и unless.
- The end construct provides an optional component to mark the
end of a conditional clause.
- Конструкция end указывает на конец условного выражения.
- miscellaneous operations
- дополнительные операции
- The named construct assigns a name to a loop construct.
- Конструкция named присваивает имя блоку цикла.
- The initially construct causes its forms to be evaluated in the loop
prologue, which precedes all loop code except for initial settings
specified by the constructs with, for, or as.
- Конструкция initially вычисляет формы в прологе цикла,
который следует перед телом цикла, но после первоначальных
связываний в конструкциях with, for и as.
- The finally construct causes its forms to be evaluated in the
loop epilogue after normal iteration terminates. An unconditional
clause can also follow the loop keyword finally.
- Конструкция finally выполняет формы в эпилоге цикла после
завершения итераций. Кроме того после слова finally могут
следовать безусловные выражения.
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:
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:
Заметьте, что цикл должен содержать как минимум одно выражение,
однако для обратной совместимости также поддерживается и следующий
формат:
где expr является любым Common Lisp’овым выражением, которое может
быть вычислено, и tag это любой символ не из множества символов loop.
Такой формат примерно эквивалентен следующему:
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 (если они были), и неявного
возврата значения из выражений собирающих результат или из выражений
проверки выхода из цикла.