apply-partially
के लिए
Emacs कोड यह है:Emacs 24 में 'लागू-आंशिक रूप से' काम करने की परिभाषा कैसे होती है?
(defun apply-partially (fun &rest args)
"Return a function that is a partial application of FUN to ARGS.
ARGS is a list of the first N arguments to pass to FUN.
The result is a new function which does the same as FUN, except that
the first N arguments are fixed at the values with which this function
was called."
`(closure (t) (&rest args)
(apply ',fun ,@(mapcar (lambda (arg) `',arg) args) args)))
यह एक सूची है कि, एक लैम्ब्डा अभिव्यक्ति की तरह एक बहुत लग रहा है, सिवाय इसके कि lambda
closure (t)
की जगह देता है। उदाहरण के लिए, (apply-partially 'cons 1)
रिटर्न इस:
(closure (t) (&rest args) (apply (quote cons) (quote 1) args))
जो, जहाँ तक मैं बता सकता हूँ, लग रहा है और इस तरह वास्तव में काम करता है:
(lambda (&rest args) (apply (quote cons) (quote 1) args))
को छोड़कर "बंद" अभिव्यक्ति "आत्म नहीं है कि
-क्वॉटिंग "लैम्ब्डा की संपत्ति, इसलिए जब मैं इसका मूल्यांकन करने की कोशिश करता हूं, तो इमाक्स मुझे सूचित करता है कि closure
में कोई फ़ंक्शन परिभाषा नहीं है: Lisp error: (void-function closure)
।
मुझे इस तरह से closure
प्रतीक का उपयोग करने के लिए एलिसप मैनुअल में कोई संदर्भ नहीं मिल रहा है। ऐसा लगता है कि किसी तरह के आंतरिक Emacs जादू। सामान्य नियमों के अनुसार बंद अभिव्यक्ति का मूल्यांकन नहीं किया जा रहा है (क्योंकि ऐसा करने से मैन्युअल रूप से त्रुटि मिलती है)।
तो यहां क्या हो रहा है? क्या मुझे पता लगाने के लिए "बंद करने" के संदर्भों के लिए सी कोड को grep करने की आवश्यकता है?
संपादित करें: ऐसा प्रतीत होता है कि Emacs 23 और नीचे, apply-partially
क्लोज़ पैकेज से बंद करने के लिए बस lexical-let
का उपयोग करता है। उपरोक्त परिभाषा संस्करण "24.0.90.1" से है। lambda
याद करते आर्ग के आंशिक सेट:
सही, आंशिक रूप से लागू होने के मामले में, व्याख्यात्मक वातावरण खाली है, लेकिन अभी भी एक अंतर है: 'तर्क' तर्क स्पष्ट रूप से बाध्य होगा, जबकि 'लैम्ब्डा' के साथ यह गतिशील रूप से बाध्य होगा। यह सुनिश्चित करता है कि 'args' नाम कहीं और उस चर के अन्य उपयोगों में हस्तक्षेप नहीं करेगा। – Stefan
आत्म-उद्धरण की कमी के कारण, यह वास्तव में एक निरीक्षण नहीं है, इसकी आवश्यकता नहीं है: '(बंद करें ...) स्रोत कोड में कभी नहीं होना चाहिए। – Stefan