26.21 Безусловное выполнение

The loop construct do (or doing) takes one or more expressions and simply evaluates them in order.

The loop construct return takes one expression and returns its value. It is equivalent to the clause do (return value).

Конструкция do (или doing) принимает одно или более выражений и просто их выполняет в исходном порядке.

Конструкция return принимает одно выражение и возвращает его значение. Оно эквивалентно такому выражению: do (return value).

[Выражение цикла] do {expr}*

[Выражение цикла] doing {expr}*

The do construct simply evaluates the specified expressions wherever they occur in the expanded form of loop.

Конструкция do просто выполняет указанные выражения. Конструкция может быть использована в любом месте формы loop.

The expr argument can be any non-atomic Common Lisp form. Each expr is evaluated in every iteration.

Аргумент expr может быть любой неатомной Common Lisp’овой формой. Каждое выражение expr вычисляется на каждой итерации цикла.

The constructs do, initially, and finally are the only loop keywords that take an arbitrary number of forms and group them as if using an implicit progn. Because every loop clause must begin with a loop keyword, you would use the keyword do when no control action other than execution is required.

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

Examples:

;;; Print some numbers.
(loop for i from 1 to 5
      do (print i)) ;Prints 5 lines
1
2
3
4
5
    NIL

;;; Print numbers and their squares.
;;; The DO construct applies to multiple forms.
(loop for i from 1 to 4
      do (print i)
         (print (* i i))) ;Prints 8 lines
1
1
2
4
3
9
4
16
    NIL

Примеры:

;;; Напечатает несколько чисел
(loop for i from 1 to 5
      do (print i)) ;Напечатает 5 строк
1
2
3
4
5
    NIL

;;; Напечатает числа и их квадраты.
;;; Конструкция DO применяется к нескольким формам.
(loop for i from 1 to 4
      do (print i)
         (print (* i i))) ;Напечатает 8 строк
1
1
2
4
3
9
4
16
    NIL


[Выражение цикла] return expr

The return construct terminates a loop and returns the value of the specified expression as the value of the loop. This construct is similar to the Common Lisp special operator return-from and the Common Lisp macro return.

The Loop Facility supports the return construct for backward compatibility with older loop implementations. The return construct returns immediately and does not execute any finally clause that is given.

Examples:

;;; Signal an exceptional condition.
(loop for item in ’(1 2 3 a 4 5)
      when (not (numberp item))
      return (cerror "enter new value"
                     "non-numeric value: ~s"
                     item)) ;Signals an error
»Error: non-numeric value: A

;;; The previous example is equivalent to the following one.
(loop for item in ’(1 2 3 a 4 5)
     when (not (numberp item))
      do (return
           (cerror "enter new value"
                   "non-numeric value: ~s"
                   item))) ;Signals an error
»Error: non-numeric value: A