我有这个示例代码,我在其中通过迭代映射的键值对来创建变量。
(defmacro block [bindings & body]
`(let [
~@(mapcat (fn [[k v]] [(if (symbol? k) k (symbol (name k))) `~v]) bindings) ]
~body))
(block {:a 1 :b 2} (if true (prn "true" a b) (prn "false")))
它工作正常。输出:“真实”1 2
但是现在我想传递与 var 相同的映射,但是它抛出了一个异常。
IllegalArgumentException 不知道如何从:clojure.lang.Symbol 创建 ISeq
(def ctx {:a 3 :b 4})
(block ctx (if true (prn "true" a b) (prn "false")))