【发布时间】:2015-09-28 22:47:31
【问题描述】:
我正在尝试编写一个为 core.match 宏生成模式的宏。
(defmacro match2
[state i predecessor]
`(match ~[state]
[(~(vec (concat (repeat i '_)
predecessor
'(& r)))
:seq)] ~i
:else false))
如果我直接将它与硬编码 predecessor 一起使用,这会很好:
(match2 ["B"] 0 ["B"]) ; 0
到目前为止一切都很好,但是如果我尝试使用函数调用传递 前任:
(match2 ["B"] 0 ((fn [] ["B"]))) ; AssertionError Invalid list syntax [] in (fn [] ["B"])
问题是因为 match2 是一个宏 clojure 不会评估函数调用,而只会按原样传递表单。未评估的表单然后转到 core.match(再次未评估,因为 core.match 本身就是一个宏)并且 core.match 抛出异常,因为表单不是正确的模式。
如何强制对宏参数进行评估?还是有其他解决方法?
有人暗示我通常使用第二个宏来完成,但我的尝试没有产生好的结果。
【问题讨论】:
-
嗯,总有'eval'
-
我已经更新了我的答案,并提供了一些关于您遇到的问题类型的好读物的链接。我鼓励您不要将当前接受的答案作为这件事的最终决定权,因为它绕过了您遇到的实际问题。
标签: clojure macros pattern-matching core.match