我正在研究clojure.core的来源。
(defmacro if-not
([test then] `(if-not ~test ~then nil))
([test then else]
`(if (not ~test) ~then ~else)))
至于第二种形式,为什么不呢
([test then else] `(if ~test ~else ~then)
答案 0 :(得分:2)
这看起来只是一种编码方式。
(if-not test then else)
(if (not test) then else)
(if test else then)
上面的代码将以相同的方式工作。编写代码有多种方法可以做同样的事情。
if-not
宏的作者可能认为以这种方式编写代码会更好。
(defmacro if-not
...
([test then else]
`(if (not ~test) ~then ~else)))
当我们阅读此代码(上文)时,我们可以按照if
,then
,else
的顺序进行思考,非常简单。
(defmacro if-not
...
([test then else]
`(if ~test ~else ~then)
是的,这样可以正常使用。但是,就可读性而言,订单then
和else
会被交换,这可能会造成混淆。
这就是为什么(在我的猜测中)作者以这种方式实现了if-not
。