为什么if-not调用“not”而不仅仅是反转参数?

时间:2017-02-22 11:50:58

标签: clojure

我正在研究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)

1 个答案:

答案 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)))

当我们阅读此代码(上文)时,我们可以按照ifthenelse的顺序进行思考,非常简单。

(defmacro if-not
  ...    
  ([test then else]
    `(if ~test ~else ~then)

是的,这样可以正常使用。但是,就可读性而言,订单thenelse会被交换,这可能会造成混淆。

这就是为什么(在我的猜测中)作者以这种方式实现了if-not