仅尝试测试宏的限制或未知数,就无法在运行时更改键的情况下使符号映射固定不变。
因此,当将k1 k2作为args传递给进程arity时,它应该创建j1 j2符号来访问syms-from-map宏中的k1和k2值。
出现编译错误:
CompilerException java.lang.IllegalArgumentException:不知道如何从以下方法创建ISeq:clojure.core $ map
用引号引起来很难编写宏:-(
(defmacro syms-from-map[m]
`(let [~@(mapcat (fn[[k v]] [k v]) (var-get (resolve m)))]
(prn "got" ~'j1 ~'j2))
)
(defmacro process-arity[args]
`(let [] (fn ~args
(let [~'map1 (zipmap '[j1 j2] ~args)]
(syms-from-map ~'map1)
))))
(def test-m1 (process-arity [k1 k2]))
(apply test-m1 [1 2])
答案 0 :(得分:0)
macroexpand-1
是有价值的工具。使用它。
(defmacro process-arity[args]
`(let [] (fn ~args
(let [~'map1 (zipmap [~'j1 ~'j2] ~args)]
(syms-from-map ~'map1)))))
(syms-from-map ~'map1)
无法按您期望的方式工作。我建议您将其转换为函数。