2009-05-26 14 views
13

मुझे लैम्बडा के साथ # 'का उपयोग क्यों करना चाहिए? यह आमतौर पर इस तरह लिखा जाता है, इसलिए मुझे लगता है कि यह एक अच्छा रूप है। लेकिन ये रेखाएं मेरे बराबर लगती हैं:# लैम्बडा के साथ क्यों उपयोग करें?

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3)) 
(2 3 4) 
> (mapcar (lambda (x) (+ x 1)) '(1 2 3)) 
(2 3 4) 

कोई भी इस बारे में शुरुआत के बारे में शुरुआत करने की देखभाल करता है?

उत्तर

11

#'function के लिए शॉर्टेंड है, जो किसी फ़ंक्शन पर पॉइंटर देता है (इसे लागू करने के बजाय)। lambda एक फ़ंक्शन देता है, और सामान्य रूप से उस फ़ंक्शन पर पॉइंटर चाहिए। चूंकि यह बहुत आम है, वहां एक मैक्रो (परिवर्तनीय स्थान में) भी है जो आपके लिए करता है, जिसे lambda भी कहा जाता है। कोड की दोनों पंक्तियां समान हैं।

जो बेहतर है Lisp-1/Lisp-2 debate पर: सामान्य लिस्प में आप मैक्रो के लिए धन्यवाद कर सकते हैं। हमेशा के रूप में, सुसंगत रहें।

+0

लिस्प पॉइंटर्स काम नहीं कर रहा है, मैक्रोज़ वेरिएबल स्पेस में नहीं हैं ... –

14

यह विभिन्न लिस्प बोलीभाषाओं में अलग है। निम्नलिखित सामान्य लिस्प का उपयोग करता है:

पहले # '(फ़ंक्शन ...) के लिए एक छोटी सी सूचना है। तो निम्न केवल टेक्स्ट रूप से अलग हैं, लेकिन आम लिस्प उन्हें एक ही रूप में पढ़ता है:

#'(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)) भी कम है, लेकिन मैक्रो विस्तार का उपयोग करता है ए के रूप बनाने के लिए)।

संबंधित मुद्दे