if-not 宏的实现如下
(defmacro if-not
"Evaluates test. If logical false, evaluates and returns then expr,
otherwise else expr, if supplied, else nil."
{:added "1.0"}
([test then] `(if-not ~test ~then nil))
([test then else]
`(if (not ~test) ~then ~else)))
第一个形式扩展为第二个形式,第二个形式使用了 not
,所以我们移除文档和其他参数简化后,实际上得到
(defmacro if-not
[test then else]
`(if (if ~test false true) then else))
这看起来比仅仅反转形式要复杂得多。我曾以为它会这样做
(defmacro if-not
"Evaluates test. If logical false, evaluates and returns then expr,
otherwise else expr, if supplied, else nil."
{:added "1.0"}
([test then] `(if-not ~test ~then nil))
([test then else]
`(if ~test ~else ~then)))
感谢你的意见,但是为什么使用 not
并不反转形式呢?请问有什么原因吗?
PS. 我相信这个问题之前可能已经问过了,但是我一直在 ask.clojure 上搜索,但是找不到。