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/ask。

我认为这没什么大不了的,主要是在代码行长度超界或类似情况下才会出现。这种情况很难想象,但或许可以进行微观基准测试。如果有人进行测试,重要的是要检查Java 8、11、17 - JVM这种东西会随着时间的推移变得更加出色,并且在新版本的JVM上可能不那么重要。

历史提示:这个问题于2015年首次提出(没有得出结论):https://groups.google.com/g/clojure/c/pMMS66-Qo1Y/m/-wnJb80pTLkJ
...