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上搜索过,但找不到。