clojure
में, apply
मैक्रो पर लागू नहीं किया जा सकता है। उदाहरण के लिए (apply and [true false])
एक अपवाद उठाता है। मैं निम्नलिखित तरीके को के बारे में सोच रहा था: पहली नज़र मेंक्लोजर में, किसी सूची में मैक्रो कैसे लागू करें?
(defmacro apply-macro[func args] `(~func [email protected]))
, यह बहुत अच्छी तरह से काम करने के लिए लग रहा था:
(apply-macro and [true 5]); 5
(apply-macro and [true 5 0]); 0
(let [a 0] (apply-macro and [true a])); 0
लेकिन, जब मैं इसे करने के लिए एक चर है कि एक वेक्टर के लिए अंक पारित कर दिया, यह ढह गई।
(let [a [true]] (apply-macro and a)); java.lang.IllegalArgumentException:
;Don't know how to create ISeq from: clojure.lang.Symbol
क्या निराशा होती है !!!!
कोई विचार apply-macro
को ठीक करने का तरीका है?
@YehonathanSharvit के लिए इस्तेमाल किया जा सकता जोड़ा जा सकता है: बात यह है कि '(लागू-स्थूल और ए) '** ** ** ** पर **' तक विस्तारित हो जाता है (और <फॉर्म में विभाजित>), लेकिन 'ए' केवल ** मूल्यांकन ** समय पर परिभाषित हो जाता है। तो 'ए' की 'unquote-splicing' (यानी' ~ @ ए') विफल हो जाती है, क्योंकि 'ए' अभी तक परिभाषित नहीं किया गया है। – liwp
निश्चित रूप से, 'ए' रन-टाइम पर एक वेक्टर है। लेकिन यदि आप संकलन समय पर 'ए' की सामग्री के साथ '(और ....)' फ़ॉर्म बनाना चाहते हैं, तो इसका कोई उपयोग नहीं है, क्योंकि संकलक 'ए' की सामग्री नहीं देख सकता है। इसलिए आपको पता चलने के बाद कि आपको 'ए' में क्या पता है, इसलिए eval की आवश्यकता है, तो आपको रनटाइम पर संकलक * फिर से कॉल करने की आवश्यकता है। यह थोड़ा उलझन में है लेकिन उम्मीद है कि तर्क समझ में आता है ..... – mikera
'फंक्शनक्शन' बहुत अच्छा लगता है !!! क्या आप लेखक हैं? क्या कोई सीमाएं हैं? – viebel