यह विभिन्न लिस्प बोलीभाषाओं में अलग है। निम्नलिखित सामान्य लिस्प का उपयोग करता है:
पहले # '(फ़ंक्शन ...) के लिए एक छोटी सी सूचना है। तो निम्न केवल टेक्स्ट रूप से अलग हैं, लेकिन आम लिस्प उन्हें एक ही रूप में पढ़ता है:
#'(lambda (x) (* x 2))
और
(function (lambda (x) (* x 2)))
# 'एक readmacro है, और जब लिस्प कोड लिस्प प्रणाली द्वारा पढ़ा जाता है बदल देती है।
लिस्प का मूल्यांकन करता है, तो
(function (lambda (x) (* x 2)))
लिस्प प्रणाली एक समारोह वस्तु बनाता है और समारोह अपने मूल्य के रूप में यह देता है।
तो, जब भी आपको किसी फ़ंक्शन के रूप में फ़ंक्शन की आवश्यकता होती है, तो आपको इसे लिखना होगा। एक मान के रूप में एक फ़ंक्शन की आवश्यकता होती है, जब आप किसी अन्य फ़ंक्शन को किसी तर्क के रूप में पास करना चाहते हैं, जब आप इसे किसी फ़ंक्शन से वापस करना चाहते हैं या जब आप इसे एक चर में संग्रहीत करना चाहते हैं। उदाहरण:
(map #'(lambda (x) (* x 2)) '(1 2 3))
(defun (y) #'(lambda (x) (* x y)))
(defparameter *twice-fn* #'(lambda (x) (* x 2)))
अब, लैम्बडा (एक्स) (* x 2)) क्या है?
संदर्भ के आधार पर यह दो अलग-अलग चीजें हैं।
लैम्ब्डा अभिव्यक्ति
लैम्ब्डा अभिव्यक्ति एक समारोह नाम के बजाय इस्तेमाल किया जा सकता:
(function foo) and (function (lambda (x) (* x 2)))
और
(foo 17) and ((lambda (x) (* x 2)) 17)
दो से ऊपर कानूनी कॉमन लिस्प वाक्य रचना कर रहे हैं। वहां एक लैम्ब्डा अभिव्यक्ति सीधे उपयोग की जा सकती है।
ध्यान दें कि निम्नलिखित दो रूपों कॉमन लिस्प में अवैध हैं:
(#'(lambda (x) (* x 2)) 17) ; illegal in Common Lisp
(function #'(lambda (x) (* x 2))) ; illegal in Common Lisp
मैक्रो
कॉमन लिस्प मानकीकरण की प्रक्रिया एक मैक्रो लैम्ब्डा जोड़ दिया गया है के दौरान (यह का हिस्सा नहीं था पहला विवरण, सीएलटीएल 1, सामान्य लिस्प के)। यह थोड़ा छोटा कोड लिखना संभव बनाता है। उदाहरण:
(lambda (x) (* x 2))
उपरोक्त मामले में LAMBDA एक मैक्रो है।
(function (lambda (x) (* x 2)))
याद रखें कि ऊपर फंक्शन फॉर्म में, भीतरी लैम्ब्डा, एक लैम्ब्डा अभिव्यक्ति का हिस्सा है समारोह को दर्शाता है और विस्तार नहीं किया जाएगा: मैक्रो विस्तार के दौरान यह करने के लिए विस्तार किया जाएगा।
तो, अब ऊपर से तीन उदाहरण लिखा जा सकता है के रूप में:
(map (lambda (x) (* x 2)) '(1 2 3))
(defun (y) (lambda (x) (* x y)))
(defparameter *twice-fn* (lambda (x) (* x 2)))
यह थोड़ा कम है, एक छोटा सा अव्यवस्था कम लग रहा है और थोड़ा अधिक योजना कोड के समान दिखता है। यह योजना कोड पढ़ने और लिखने के लिए प्रयुक्त प्रोग्रामर के लिए थोड़ा बेहतर दिख रहा है।
सारांश
क) (समारोह (लैम्ब्डा (एक्स) (* एक्स 2))) 'सही' जिस तरह से कोड एक मूल्य के रूप में एक फ़ंक्शन कि लिखने के लिए है।
ख) # '(लैम्ब्डा (एक्स) (* एक्स 2)) लैम्ब्डा के ऊपर
ग एक छोटी अंकन) ((एक्स) (* एक्स 2)) भी कम है, लेकिन मैक्रो विस्तार का उपयोग करता है ए के रूप बनाने के लिए)।
लिस्प पॉइंटर्स काम नहीं कर रहा है, मैक्रोज़ वेरिएबल स्पेस में नहीं हैं ... –