在Common Lisp中使用标签

gum*_*mbo 6 lisp common-lisp

在关于代码审查的这个问题中,我被告知要使用labels代替defun.我已经在互联网上看了,但我找不到任何方法来使用它,仍然保持我的代码的方式.

我怎么能labels在我的代码中使用?

Rai*_*wig 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))))))
Run Code Online (Sandbox Code Playgroud)

示例电话:

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
Run Code Online (Sandbox Code Playgroud)