マクロを実装して、インフィックスリストを接頭辞1に再帰的に変換しようとしています。次のような問題が発生しました。clojureで、再帰を使用してマクロを実装するときにコードテンプレートを実行する方法
;;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]
問題はどこですか?コードテンプレートでマクロを正しく定義するには?
P.S.私はこれにコードを変更し、それは動作します、なぜですか?違い?:オリジナル版で
(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