2011-09-11 6 views
6

In this question on code review में लेबल का उपयोग मुझे defun के बजाय labels का उपयोग करने के लिए कहा गया है। मैंने इंटरनेट पर देखा है, लेकिन मुझे इसका उपयोग करने का कोई तरीका नहीं मिला और फिर भी मेरा कोड इस तरह से रखता है।सामान्य लिस्प

मैं अपने कोड में 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

यह 'लेबल' के कुछ सरल और आसान स्पष्टीकरण में मदद कर सकता है। –