2011-09-11 35 views
6

In this question on code review Tôi đã được yêu cầu sử dụng labels thay vì defun. Tôi đã xem trên internet, nhưng tôi không thể tìm thấy bất kỳ cách nào để sử dụng nó và vẫn giữ mã của tôi theo cách của nó.Sử dụng Nhãn trong Common Lisp

Tôi làm cách nào để sử dụng labels trong mã của mình? gọi

Trả lời

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)))))) 

Ví dụ:

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

Cảm ơn! nếu tôi muốn 'init' chỉ được gọi khi tôi muốn? – gumbo

+0

Điều này có thể giúp giải thích một cách đơn giản và dễ dàng về 'nhãn'. –

Các vấn đề liên quan