बस मूल्य की प्रति के साथ एक चर को बांधें। उदाहरण के लिए:
(let ((i i))
(lambda() i))
यह वास्तव में, यात्रा निर्माणों के साथ एक महत्वपूर्ण तकनीक है क्योंकि कुछ
तरह
(loop for i from 1 to 10
collecting (lambda() i))
एक ही चर से अधिक दस बंदी वापस आ सकते हैं, तो यह लिखने के लिए आवश्यक हो जाता है:
(loop for i from 1 to 10
collecting (let ((i i)) (lambda() i)))
यदि आपको वास्तव में केवल एक फ़ंक्शन की आवश्यकता है जो मान देता है, तो आप constantly का भी उपयोग कर सकते हैं (लेकिन मुझे उम्मीद है कि असली उपयोग केस अधिक जटिल है):
(loop for i from 1 to 10
collecting (constantly i))
कुछ मामलों में पुनरावृत्ति रूपों में अस्पष्टता वास्तव में मानक द्वारा निर्दिष्ट की जाती है। जैसे, dotimes के लिए, dolist
यह कार्यान्वयन पर निर्भर है dotimes प्रत्येक यात्रा पर वार करने का एक नया बंधन स्थापित करता है कि क्या है या यह है कि क्या शुरुआत में वर के लिए एक बाध्यकारी एक बार स्थापित करता है और फिर बाद में किसी भी पुनरावृत्तियों पर यह प्रदान करती है।
अधिक आदिम do, हालांकि, वास्तव में फार्म के लिए बाइंडिंग का एक सेट है कि वहाँ है, और है कि वे एक यात्रा पर अपडेट किया जाता है (जोर जोड़ा) निर्दिष्ट करता है:
प्रत्येक की शुरुआत में पहले के अलावा पुनरावृत्ति, वर्र्स निम्नानुसार अपडेट किए गए हैं।& Hellip;
यह अस्पष्टता कार्यान्वयन को थोड़ा अधिक लचीलापन देती है।
(defmacro dolist ((var list &optional result) &body body)
`(progn (mapcar #'(lambda (,var)
,@(ex:body-declarations body)
(tagbody
,@(ex:body-tags-and-statements body)))
,list)
(let ((,var nil))
,result)))
(defmacro dolist ((var list &optional result) &body body)
(let ((l (gensym (string '#:list-))))
`(do* ((,l ,list (rest ,l))
(,var (first ,l) (first ,l)))
((endp ,l) ,result)
,@body)))
मैं Dolist, उदाहरण के लिए निम्न में से किसी के साथ परिभाषित किया जा सकता है 'एलईटी' के बारे में कुछ पढ़ने का प्रस्ताव है। –