在Common Lisp中使用标签

时间:2011-09-11 21:49:32

标签: lisp common-lisp

In this question on code review我被告知要使用labels代替defun。我已经在互联网上看了,但我找不到任何方法来使用它,仍然保持我的代码的方式。

我如何在代码中使用labels

1 个答案:

答案 0 :(得分:6)

(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