gpt4 book ai didi

clojure - 在 clojure 中将 "or"操作定义为宏而不是简单地定义为函数有什么好处?

转载 作者:行者123 更新时间:2023-12-02 12:40:14 31 4
gpt4 key购买 nike

我希望这个解释能让我更好地了解使用宏的优点。

最佳答案

在函数中,所有参数在调用之前都会被评估。

这意味着 or 作为函数不能是惰性的,而宏可以将 or 重写为 if 语句,该语句仅在以下情况下计算分支:这样做是有必要的。

<小时/>

更具体一点,请考虑:

(or (cached-lookup) (expensive-operation))

...它被重写成如下所示:

(let [or__1234__auto (cached-lookup)]
(if or__1234__auto
or__1234__auto
(expensive-operation)))

...这样,如果 (cached-lookup) 的返回值为 nil。在实现常规 JVM 调用约定时,您无法使用函数来做到这一点:无论是否需要其结果,expense-operation 都会始终被评估,因此它的结果可以作为参数传递给函数。

<小时/>

顺便说一句,如果您采用零参数函数作为参数,您可以在这种情况下实现一个函数。也就是说,你可以这样做:

(defn or*
([] false) ; 0-arg case
([func-one] (func-one)) ; 1-arg case
([func-one func-two] ; optimized two-arg case
(let [first-result (func-one)]
(if first-result
first-result
(func-two))))
([func-one func-two & rest] ; general case
(let [first-result (func-one)]
(if first-result
first-result
(apply or* func-two rest)))))

当您必须实现一个宏时,让它生成“thunk”(匿名函数),并将它们传递给像这个这样的高阶函数通常会很有帮助;这极大地提高了可组合性,因为可以使用诸如 partial 之类的高级函数来包装、修改或调用函数,而宏却无法做到这一点。

关于clojure - 在 clojure 中将 "or"操作定义为宏而不是简单地定义为函数有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818118/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com