2024年Clojure调查!中分享您的看法。

欢迎!请查看关于页面以获取更多有关如何操作的信息。

+2投票
语法和reader
重新标记

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的持续改进会变得不那么重要。

历史记录:这个问题(没有结论性的解决方案)在2015年出现:https://groups.google.com/g/clojure/c/pMMS66-Qo1Y/m/-wnJb80pTLkJ
...