2011-02-05 17 views
12

यह वही के रूप में दोनोंलिस्प में 'और #' के बीच क्या अंतर है?

(mapcar 'car '((foo bar) (foo1 bar1))) 

और

(mapcar #'car '((foo bar) (foo1 bar1))) 

काम लगता है।

और मुझे यह भी पता है कि ' का मतलब है (उद्धरण चिह्न) और #' का अर्थ है (फ़ंक्शन फ़ंक्शन-नाम)।

लेकिन अंतर्निहित अंतर क्या है? पिछलेमें ये 2 दोनों काम क्यों करते हैं?

उत्तर

13
'foo 

प्रतीक FOO मूल्यांकन करता है।

#'foo 

खाद्य नाम से जुड़े फ़ंक्शन का मूल्यांकन करता है।

लिस्प में एक प्रतीक को फ़ंक्शन के रूप में बुलाया जा सकता है जब प्रतीक फू के पास फ़ंक्शन बाध्यकारी होता है। यहां कार एक प्रतीक है जिसमें एक फ़ंक्शन बाध्यकारी है।

लेकिन यह काम नहीं करता:

(flet ((foo (a) (+ a 42))) 
    (mapcar 'foo '(1 2 3 4 5))) 

प्रतीक स्थानीय शाब्दिक समारोह का उपयोग नहीं करता है क्योंकि FOO के रूप में और लिस्प प्रणाली शिकायत जब foo एक समारोह कहीं परिभाषित नहीं है यही कारण है कि।

हम लिखने की ज़रूरत:

(flet ((foo (a) (+ a 42))) 
    (mapcar #'foo '(1 2 3 4 5))) 

यहाँ (समारोह foo) या इसके आशुलिपि संकेतन # 'foo शाब्दिक स्थानीय समारोह FOO को दर्शाता है।

भी ध्यान रखें कि में

(funcall #'foo ...) 

बनाम

(funcall 'foo ...) 

बाद में एक और अविवेक कर सकता है, क्योंकि यह प्रतीक से समारोह देखने के लिए की जरूरत है, जबकि # 'foo समारोह को दर्शाता है सीधे।

सारांश: प्रतीक, बाध्यकारी एक समारोह बुला के माध्यम से प्रतीक काम करता है एक समारोह है

हैं।

9

ये 2 दोनों पिछले नक्शा में क्यों काम करते हैं?

प्रलेखन mapcar के लिए कहते हैं:

समारोह प्रतीक है, तो यह रूप में symbol-function द्वारा अगर एक समारोह के लिए मजबूर कर रहा है।

1

अपने mapcar को एक गुमनाम समारोह (लैम्ब्डा) गुजर रहा कोशिश करो और आप देखेंगे कि #' की आवश्यकता है के बाद से अपने आप में बोली एक प्रतीक है कि एक समारोह के लिए बाध्य है उम्मीद है, लेकिन प्रतीक एक संयुक्त राष्ट्र में मौजूद नहीं है नामित समारोह:

CL-USER> (mapcar '(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) 
      datum: (LAMBDA (X) (FORMAT T "it is ~d" X))>. 

बनाम:

CL-USER> (mapcar #'(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
it is 3it is 5it is 7 
(NIL NIL NIL)