2009-07-28 7 views
33

, लेकिन एक स्थानीय समारोह मैं जीएनयू मैनुअल ने सलाह दी हूँ 'flet' का उपयोग करने के लिए बाध्य करने के लिए:मैं अगर आप इसे विहित सूत्रीकरण कहेंगे नहीं जानते हैं और Emacs में flet तुतलाना

(defun adder-with-flet (x) 
    (flet ((f (x) (+ x 3))) 
    (f x)) 
) 

हालांकि , दुर्घटना से मैंने कोशिश की (एक बिट के लिए योजना में खेला जाने के बाद) निम्नलिखित अभिव्यक्ति, जहां मैं 'लेट' का उपयोग करके एक चरम पर एक लैम्ब्डा अभिव्यक्ति बांधता हूं, और यह भी काम करता है अगर मैं फ़ंक्शन को मैपकार *:

(defun adder-with-let (x) 
    (let ((f (lambda (x) (+ x 3)))) 
    (car (mapcar* f (list x)))) 
) 
पर फ़ंक्शन पास करता है

और दोनों कार्य कार्य करते हैं:

(adder-with-flet 3) ==> 6 
(adder-with-let 3) ==> 6 

दूसरा काम क्यों करता है? मुझे कोई दस्तावेज नहीं मिल रहा है जहां प्रतीकों के कार्यों को बांधने के लिए 'चलो' का उपयोग किया जा सकता है।

+0

किसी को भी करने के लिए इस बाहर की कोशिश कर रहा, ध्यान दें कि 'flet' Emacs उपयोग कर रहे हैं के संस्करण में उपलब्ध नहीं हो सकता है, जो मामले में एक' (सीएल की आवश्यकता होती है 'की कोशिश) 'जैसा कि नीचे उल्लिखित है (' फलेट' एक आम बात है)। – Robert

+0

कौन सा जीएनयू मैनुअल यहां 'फलेट' के उपयोग की सिफारिश करता है? – Stefan

+1

Emacs से 25.1.1 कार्य का वर्णन करें: flet यह मैक्रो 24.3 के बाद अप्रचलित है; या तो 'cl-flet' या 'cl-letf' – AAAfarmclub

उत्तर

37

योजना के विपरीत, Emacs Lisp 2-lisp है, जिसका अर्थ है कि प्रत्येक प्रतीक में दो अलग-अलग बाइंडिंग होते हैं: मान बाध्यकारी और फ़ंक्शन बाइंडिंग। फ़ंक्शन कॉल (a b c d) में, पहला प्रतीक (a) फ़ंक्शन बाध्यकारी का उपयोग करके देखा जाता है, शेष (b c d) मान बाध्यकारी का उपयोग करके देखा जाता है। विशेष फॉर्म let एक नया (स्थानीय) मान बाध्यकारी बनाता है, flet एक नया फ़ंक्शन बाध्यकारी बनाता है।

ध्यान दें कि मूल्य या समारोह बंधन देखने के लिए इस्तेमाल किया है या नहीं, (a b c d) समारोह कॉल में स्थिति पर निर्भर करता है प्रकार देखा-अप मूल्य का पर नहीं। विशेष रूप से, एक मूल्य बाध्यकारी कार्य करने के लिए हल कर सकते हैं।

अपने पहले उदाहरण में, आप में कार्य-बाँध f (flet के माध्यम से), और फिर एक समारोह देखने कार्य करें:

(f ...) 

अपने दूसरे उदाहरण में, आप मूल्य-बाँध f एक समारोह के लिए (let के माध्यम से)

(... f ...) 

दोनों काम है क्योंकि आप बंधन और प्रत्येक मामले में देखने का एक ही तरह का उपयोग करें:, और फिर एक मूल्य देखने का उपयोग करें।

http://en.wikipedia.org/wiki/Common_Lisp#Comparison_with_other_Lisps

+0

स्पष्टीकरण के लिए धन्यवाद! मैं देखता हूं, यह मूल्य-लुकअप और फ़ंक्शन-लुकअप के बीच एक अंतर है। मैं कार्यों और चर के लिए अलग-अलग नामस्थान रखने के सम्मेलन से परिचित था लेकिन मैपकार * द्वारा एक चर के रूप में एक फ़ंक्शन को बाध्य करने के तरीके से कनेक्ट नहीं किया जा सका। – hatmatrix

18

मैं Emacs की एक त्वरित खोज तुतलाना मैनुअल किया था और के बाद से है कि cl का एक हिस्सा है 'flet के लिए किसी भी संदर्भ है, जो बहुत आश्चर्य की बात नहीं है नहीं पा सके - common-lisp package

let स्थानीय बाध्यकारी भी करेगा, लेकिन यह उस प्रतीक के लिए "function cell" से जुड़ा नहीं होगा।

यह यानी काम करता है:

(let ((myf (lambda (x) (list x x)))) 
    (eval (list myf 3))) 

लेकिन

(let ((myf (lambda (x) (list x x)))) 
    (myf 3)) 

त्रुटि के साथ विफल: "लिस्प त्रुटि: (शून्य-समारोह myf)"

दूसरी ओर flet, करता है फ़ंक्शन सेल के लिए बाध्यकारी करें, इसलिए यह काम करता है:

(flet ((myf (x) (list x x))) 
    (myf 3)) 

ध्यान दें कि flet आपको myf प्रतीक का उपयोग करने की अनुमति देता है, जबकि let नहीं है - आपको "मूल्य सेल" से कार्य प्राप्त करने के लिए कुछ संकेतों का उपयोग करना होगा और उचित रूप से लागू करना होगा।

आपके उदाहरण में, mapcar ''eval के उपयोग के बराबर था।

+0

का उपयोग अपनी प्रतिक्रिया के लिए धन्यवाद! ज़ीलाज के स्पष्टीकरण के साथ मैं देखता हूं कि यह 'eval' चीज भी कैसे काम करती है। हां, सीएल विस्तार में फ्लेलेट दिखाई देता है; मैंने मूल रूप से पढ़ा था कि (फ्लेलेट का उपयोग करने से पहले 'सीएल' की आवश्यकता थी, लेकिन मुझे लगता है कि नए emacs में यह अब मामला नहीं है ... – hatmatrix

+5

'सीएल' एक्सटेंशन बॉक्स से बाहर Emacs के साथ भेज दिया गया था, लोगों ने कैसे किया फ़ंक्शन परिभाषाओं को संभाल लें जिन्हें लेट-जैसी अर्थशास्त्र के साथ घोषित करने की आवश्यकता है? क्या यह सिर्फ स्वीकार किया गया था कि इसे करने का तरीका है? – d11wtq

7

@ d11wq वहाँ `इस उद्देश्य के लिए funcall 'है। निम्नलिखित काम करता है:

(defun adder-with-let (x) 
    (let ((f #'(lambda (x) (+ x 3)))) 
    (funcall f 3))) 

(adder-with-let 3) ;=> 6 
0

आप flet उपयोग करने के लिए यदि आप नहीं करना चाहते हैं नहीं है। आप निम्न उदाहरण में let का उपयोग करके परिभाषित एक स्थानीय प्रतीक के समारोह कक्ष में एक समारोह जगह:

(let ((ALocalSymbol)) 
    (fset 'ALocalSymbol (lambda (x) (* 2 x))) 
    (ALocalSymbol 4) 
) 

इस मूल्यांकन 8. वापस आ जाएगी (let ((ALocalSymbol))...) में ALocalSymbol के सामने बोली नोटिस करें। जबकि setq उद्धरण चिह्न, fset नहीं है।

flet प्रकार की एक वाक्य रचनात्मक चीनी है। शून्य-मूल्यवान प्रतीकों को परिभाषित करने के लिए एक सादे-पुराने let का उपयोग करके, आपको यह निर्धारित करने की अनुमति मिलती है कि प्रतीक के "सेल" को सेट किया जाए। फ़ंक्शन सेल सेट करने के लिए आप प्रतीक के मान सेल या fset सेट करने के लिए setq का उपयोग कर सकते हैं।

आशा इस मदद करता है,

पाब्लो

+0

यह पूरी तरह से गलत है, और आंतरिक प्रतीक 'ALocalSymbol' के लिए (एकल) वैश्विक फ़ंक्शन सेल को बांधता है। (केवल * मूल्य * कोशिकाओं को बाध्य किया जाता है।) यदि आप इंटर्न वाले प्रतीक को केवल बाध्यकारी (मान) के बजाय, * नया * (अनियंत्रित) प्रतीक बना रहे थे, तो आप ऐसा कर सकते हैं। – phils

+0

स्पष्टता के लिए: यह कोड वैश्विक फ़ंक्शन नामस्थान में फ़ंक्शन 'ALocalSymbol' को परिभाषित करता है। यदि उस नाम से एक फ़ंक्शन पहले ही परिभाषित किया गया था, तो यह क्लॉब्ड है। – phils

+0

ध्यान दें कि यदि आपने एक अनियंत्रित प्रतीक बनाया है, तो '(ALocalSymbol 4)' अभी भी आंतरिक प्रतीक के फ़ंक्शन को कॉल करेगा, इसलिए आपको अपने अनियंत्रित प्रतीक/फ़ंक्शन को 'funcall' (या इसी तरह) करना होगा। – phils

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