common-lisp
Основные петли
Поиск…
Синтаксис
- (do ({var | (var [init-form [step-form]])} *) (end-test-form result-form *) Объявление * {tag | statement} *)
- (do * ({var | (var [init-form [step-form]])} *) (end-test-form result-form *) Объявление * {tag | statement} *)
- (объявление dolist (var list-form [result-form]) * {tag | statement} *)
- (dotimes (var count-form [result-form]) декларация * {tag | statement} *)
DOTIMES
dotimes
- это макрос для целочисленной итерации по одной переменной от 0 ниже некоторого значения параметра. Один из примеров:
CL-USER> (dotimes (i 5)
(print i))
0
1
2
3
4
NIL
Обратите внимание, что NIL
- это возвращаемое значение, так как мы сами не предоставили его; переменная начинается с 0 и по всему циклу становится значениями от 0 до N-1. После цикла переменная становится N:
CL-USER> (dotimes (i 5 i))
5
CL-USER> (defun 0-to-n (n)
(let ((list ()))
(dotimes (i n (nreverse list))
(push i list))))
0-TO-N
CL-USER> (0-to-n 5)
(0 1 2 3 4)
DOLIST
dolist
- это dolist
макрос, созданный для простой dolist
списков. Одним из самых простых применений было бы:
CL-USER> (dolist (item '(a b c d))
(print item))
A
B
C
D
NIL ; returned value is NIL
Обратите внимание, что поскольку мы не предоставили возвращаемое значение, возвращается NIL
(а A, B, C, D печатаются на *standard-output*
).
dolist
также может возвращать значения:
;;This may not be the most readable summing function.
(defun sum-list (list)
(let ((sum 0))
(dolist (var list sum)
(incf sum var))))
CL-USER> (sum-list (list 2 3 4))
9
Простая петля
Макрос цикла имеет две формы: «простую» форму и «расширенную» форму. Расширенная форма рассматривается в другом разделе документации, но простой цикл полезен для очень простого цикла.
Простая форма цикла принимает несколько форм и повторяет их до тех пор, пока цикл не будет завершен с использованием возврата или какого-либо другого выхода (например, throw ).
(let ((x 0))
(loop
(print x)
(incf x)
(unless (< x 5)
(return))))
0
1
2
3
4
NIL