我正在尝试编写一个为 core.match 宏生成模式的宏。
(defmacro match2
[state i predecessor]
`(match ~[state]
[(~(vec (concat (repeat i '_)
predecessor
'(& r)))
:seq)] ~i
:else false))
如果我直接将它与硬编码的前任一起使用,这很好用:
(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 抛出异常,因为表单不是正确的模式。
如何强制对宏参数进行评估?或任何其他解决方法?
我被暗示这通常是用第二个宏来完成的,但我的尝试没有产生好的结果。