2024 年 Clojure 状态调查! 中分享你的想法!

欢迎!请参阅 关于 页面以了解更多关于此如何运作的信息。

+2
语法和读取器
重新标记

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

1 答案

+1

选择
 
最佳答案

登录为 https://clojure.atlassian.net/browse/CLJ-2691

这个问题之前在Slack上已经提出过,不知道是否有jira或者请求。

我认为这不是什么大事,它可能主要出现在内联代码大小边界被超出之类的情况下。很难想到这种情况,但它也许适用于微观基准测试。如果有人测试它,重要的地方是检查Java 8、11、17 - 这正是jvm随时间改进的事情,它在新版jvm上可能会显得不那么重要。

历史记录:该问题(没有得出结论性的解决方法)于2015年提出:https://groups.google.com/g/clojure/c/pMMS66-Qo1Y/m/-wnJb80pTLkJ
...