我试图写一个clojure宏,让我调用一个函数并从地图/结构中检索参数所提供的密钥值,如:Clojure宏抛出“CompilerException java.lang.IllegalStateException:Var clojure.core/unquote未绑定”当调用
(with-params {:apple 2 :banana 3 :cherry 7} + :apple :banana)
;; 5
,但是当我尝试使用我写的宏:
(defmacro with-params [s f & symbols]
`(~f [email protected](map ~s ~symbols)))
调用
(with-params {:apple 2 :banana 3 :cherry 7} + :apple :banana)
给我
#<CompilerException java.lang.IllegalStateException: Var clojure.core/unquote is unbound. (NO_SOURCE_FILE:0)>
有人能帮助我了解如何语法,引用的作品吗?
感谢您的建议!但是您能澄清一下为什么在map之前放置'〜@'会导致编译器出现问题吗?我认为我可以通过拼接地图的结果来制作一个列表表达式,但是我认为在这种情况下“应用”确实效果更好。 –
@Scott:经过一番思考之后,我想出了本来应该有的解决方案。希望现在更清楚一点。如果我的回答很有帮助,您可以对其进行修改或将其标记为已接受。 –
严格地说它应该是(defmacro with-params [sf&symbols]'(〜f〜@(map(fn [symbol](list symbol s))symbols)),因为这将允许map /运行时间 –