2011-09-11 15 views
6

In this question on code reviewdefunの代わりにlabelsを使用するように言われました。私はインターネットを見てきましたが、私はそれを使う方法を見つけることができず、それでも私のコードをそのまま保ちました。Common Lispでのラベルの使用

labelsはどのように使用できますか?

答えて

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 
+0

ありがとう!もし私がしたいときだけ 'init'を呼びたいのであればどうしますか? – gumbo

+0

これは、 'labels'の簡単で簡単な説明に役立ちます。 –