2009-12-05 14 views

उत्तर

12

वे काफी अंतर-परिवर्तनीय हैं। जवाब यह है कि function लैम्ब्डा को बाइट संकलित करने में सक्षम बनाता है, जबकि अन्य दो (और समकक्ष नहीं होते हैं)। नोट: इसका मतलब यह नहीं है कि function वास्तव में बाइट लैम्ब्डा संकलित करता है।

कोई इसे कैसे समझ सकता है? एक छोटे Emacs lisp आत्मनिरीक्षण कुछ सुराग प्रदान करता है। प्रारंभ करने के लिए: सी एच एफ समारोह आरईटी:

समारोह 'सी स्रोत कोड' में एक विशेष रूप है।

(समारोह आर्ग)

की तरह 'बोली', लेकिन वस्तुओं जो कार्य हैं के लिए पसंद किया। बाइट संकलन में, 'फ़ंक्शन' संकलित होने के लिए तर्क का कारण बनता है। 'उद्धरण' ऐसा नहीं कर सकता है।

ठीक है, ताकि (function (lambda ...)) और '(lambda ...) के बीच का अंतर है, पहली बाइट संकलक है कि यह सुरक्षित रूप से अभिव्यक्ति संकलन कर सकते हैं बताता है। 'जबकि एड भाव जरूरी संकलित नहीं किया जा सकता (वे सिर्फ नंबरों की सूची हो सकता है के लिए

क्या सिर्फ नंगे (lambda ...)Ch च लैम्ब्डा आरईटी शो के बारे में:।?

लैम्ब्डा है `subr.el 'में एक लिस्प मैक्रो।

(लैम्ब्डा args [docstring] [इंटरैक्टिव] शरीर)

वापसी एक लैम्ब्डा अभिव्यक्ति। एक फॉर्म का कॉल (लैम्ब्डा तर्क डॉकस्ट्रिंग इंटरैक्टिव बॉडी) स्वयं उद्धरण है; लैम्ब्डा अभिव्यक्ति का मूल्यांकन करने का नतीजा अभिव्यक्ति है। लैम्ब्डा अभिव्यक्ति तो , एक समारोह, यानी, के रूप में जमा एक प्रतीक के समारोह मूल्य के रूप में इलाज किया जा सकता 'funcall' या 'mapcar', आदि

इसलिए, (lambda ...) और '(lambda ...) हैं पारित कर दिया बराबर।

इसके अलावा, #'(lambda ...) नोटेशन है, जो (function (lambda ...)) के लिए वाक्य रचनात्मक चीनी है।

Emacs lisp में फ़ंक्शंस के बारे में अधिक जानकारी के लिए, Functions info pages पढ़ें।

बस इस सब की जाँच करने के लिए, आप * खरोंच * बफर में निम्न लिखें और मूल्यांकन कर सकते हैं भाव:

(caddr '(lambda (x) (+ x x))) 
(+ x x) 

(caddr (lambda (x) (+ x x))) 
(+ x x) 

(caddr (function (lambda (x) (+ x x)))) 
(+ x x) 

(equal '(lambda (x) (+ x x)) 
     (function (lambda (x) (+ x x)))) 
t 

(equal '(lambda (x) (+ x x)) 
     (lambda (x) (+ x x))) 
t 

तो, लैम्ब्डा का उपयोग कर बस सूचियों कि के रूप में इस्तेमाल किया जा सकता का निर्माण के सभी तीन वेरिएंट कार्य (जिनमें से एक बाइट संकलित हो सकता है)।

+0

लेकिन एक अभिव्यक्ति के सामने एक सिंगल-कोट का उपयोग नहीं कर रहा है जिससे एलआईएसपी दुभाषिया इसे वापस लौटाता है और इसका मूल्यांकन नहीं करता है? इसका मतलब यह होगा कि '(+ 1 2) वापस आ जाएगा (+ 1 2) और (+ 1 2) 3 के रूप में वापस आ जाएगा ... – Joscha

+0

@ जोस्चा, सुनिश्चित नहीं है कि आप किस भाग पर टिप्पणी कर रहे हैं। लैम्ब्डा आत्म-उद्धरण है, जिसका अर्थ यह है कि जब दुभाषिया लैम्ब्डा अभिव्यक्ति का मूल्यांकन करता है, तो परिणाम वही लैम्ब्डा अभिव्यक्ति होता है। मेरा मानना ​​है कि यह इमाक्स (अनिश्चित काल और गतिशील सीमा) द्वारा उपयोग किए जाने वाले परिवर्तनीय लुकअप के कारण अधिकांश अन्य लिस्प्स से अलग है। योजना कुछ हद तक पर्यावरण की जानकारी के साथ थोड़ा बंद कर देती है क्योंकि व्याख्यात्मक सीमा (मुझे विश्वास है)। –

+2

'(लैम्ब्डा ...) 'वास्तव में' (फ़ंक्शन (लैम्ब्डा ...)) '' '' (lambda ...) 'के बराबर है, जैसा कि आप मूल्यांकन करके कोशिश कर सकते हैं' (मैक्रोएक्सपैंड (लैम्ब्डा (एक्स) (+ एक्सएक्स))) – nschum

3

अच्छी तरह से (quote (lambda...)) और (lambda...) बराबर नहीं हैं (जब बाइट संकलन)। उद्धृत lambdas बाइट संकलित नहीं हैं जबकि बाकी सब कुछ है।

उदाहरण के लिए:

(defun foo (a) 
    (byte-code-function-p a)) 

(defun bar() 
    (foo '(lambda() (ignore 'me)))) 

(defun bar2() 
    (foo (lambda() (ignore 'me)))) 

(defun bar3() 
    (foo (function (lambda() (ignore 'me))))) 

(defun bar4() 
    (foo #'(lambda() (ignore 'me)))) 

(byte-compile 'bar) 
(byte-compile 'bar2) 
(byte-compile 'bar3) 
(byte-compile 'bar4) 

(bar) ; -> nil 

(bar2) ; -> t 
(bar3) ; -> t 
(bar4) ; -> t 

आप आम तौर पर एक लैम्ब्डा जब तक समारोह आप लैम्ब्डा के लिए यह सिर्फ funcall से इसके साथ कुछ और कर रहा है पारित करने के लिए जा रहे हैं उद्धृत करने के लिए नहीं करना चाहती।

+1

मेरा मानना ​​है कि यह समय के साथ बदल गया है। '(जानकारी" (elisp) बेनामी कार्यों को देख रहे हैं "), यह कहता है" आजकल 'फ़ंक्शन' को पूरी तरह से छोड़ना संभव है ... ऐसा इसलिए है क्योंकि 'लैम्ब्डा' स्वयं 'फ़ंक्शन' का तात्पर्य है। " वह पृष्ठ पहले पढ़ने पर थोड़ा उलझन में है, लेकिन आपके उदाहरण अच्छे स्पष्टीकरण के लिए बनाते हैं :) (ए) '(फ़ंक्शन (लैम्ब्डा ...))' '(उद्धरण (लैम्ब्डा ...) का एक रूप है) 'जो बाइट संकलन सक्षम बनाता है। (बी) * un * -quoted '(lambda ...)' (आजकल) '(फ़ंक्शन (लैम्ब्डा ...)) जैसा ही है! – phils

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