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