का उपयोग कर मैक्रो को कार्यान्वित करते समय कोड टेम्पलेटिंग कैसे करें, मैं एक इंफिक्स सूची को एक उपसर्ग सूची में परिवर्तित करने के लिए मैक्रो को कार्यान्वित करने का प्रयास कर रहा हूं। मुझे निम्न प्रकार की समस्या आती है:क्लोजर में, रिकर्सन
;;this works
(defmacro recursive-infix [form]
(list (second form) (first form)
(if (not (seq? (nth form 2)))
(nth form 2)
(recursive-infix (nth form 2)))))
;;this doesn't work
(defmacro my-recursive-infix [form]
`(~(second form) ~(first form)
(if (not (seq? ~(nth form 2)))
~(nth form 2)
(my-recursive-infix ~(nth form 2)))))
(macroexpand '(recursive-infix (10 + 10)))
;;get (+ 10 10)
(macroexpand '(my-recursive-infix (10 + 10)))
;;get (+ 10 (if (clojure.core/not (clojure.core/seq? 10)) 10 (user/my-recursive-infix 10)))
(recursive-infix (10 + 10))
;;get 20
(my-recursive-infix (10 + 10))
;;Don't know how to create ISeq from: java.lang.Integer [Thrown class java.lang.IllegalArgumentException]
समस्या कहां है? कोड टेम्पलेटिंग के साथ मैक्रो को सही तरीके से परिभाषित कैसे करें?
पीएस मैंने कोड को इस में बदल दिया और यह काम करता है, क्यों? क्या अंतर ?:
(defmacro my-recursive-infix [form]
(if (not (seq? (nth form 2)))
`(~(second form) ~(first form) ~(nth form 2))
`(~(second form) ~(first form) (my-recursive-infix (nth form 2)))))
डालने से कोई लेना देना है "अगर ब्लॉक" बैकक्वॉट की बाध्यकारी रेंज में? – lkahtz