Использование меток в Common Lisp - PullRequest
6 голосов
/ 12 сентября 2011

В этом вопросе о проверке кода мне сказали использовать labels вместо defun.Я посмотрел в Интернете, но я не мог найти способ его использовать, и все равно оставил свой код таким, какой он есть.

Как я могу использовать labels в своем коде?

1 Ответ

6 голосов
/ 12 сентября 2011
(defun example ()
  (let ((a 0)
        (f nil))
    (macrolet ((next (state)
                 `(setf f (function ,state))))
      (labels ((init ()
                 (setf a 0)
                 (next inc))
               (inc ()
                 (incf a)
                 (next inc)
                 (when (> a 5)
                   (next reset)))
               (reset ()
                 (setf a 0)
                 (next inc))
               (controller ()
                 (funcall f)
                 (print a)))
        (init)
        (loop repeat 20
              do (controller))))))

Пример вызова:

CL-USER 7 > (example)

1 
2 
3 
4 
5 
6 
0 
1 
2 
3 
4 
5 
6 
0 
1 
2 
3 
4 
5 
6 
NIL
...