【发布时间】:2017-09-23 02:01:37
【问题描述】:
我想通过写一个宏来写一个ACL模块,这个宏是检查宏中每个函数调用的结果,如果一个返回false,那么ACL会失败而不运行下面的函数调用。如果一个返回 true 并且仍有函数调用需要检查,那么检查以下直到最后一个。
(defmacro checks
[head & tail]
`(let [status# ~head]
(if (and (true? status#)
(seq '~tail))
(checks ~@tail)
status#)))
我会这样称呼这个宏:
(checks (module1 args) (module2 args))`
但是对于宏定义中的(check ~@tail),这将失败。问题是我想取消引用拼接列表,但不调用列表中的每个函数。
【问题讨论】:
-
只是一个提示,不要使用反引号来格式化大段代码。通过突出显示并按 ctrl+k 将其缩进四个空格。
-
and宏不会做同样的事情吗? -
谢谢你们的cmets。