gpt4 book ai didi

Clojure 风格 : defn- vs. letfn

转载 作者:行者123 更新时间:2023-12-02 17:36:47 26 4
gpt4 key购买 nike

Clojure 风格(以及一般良好的软件工程)强调许多小函数,其中的一个子集是公开可见的,以提供外部接口(interface)。

在 Clojure 中似乎有几种方法可以做到这一点:

(letfn [(private-a ...)
(private-b ...)]
(defn public-a ...)
(defn public-b ...))

(defn- private-a ...)
(defn- private-b ...)
(defn public-a ...)
(defn public-b ...)

letfn 形式看起来更冗长,而且可能不太灵活,但它缩小了函数的范围。

我的猜测是,letfn 仅适用于其他形式,当仅在很小的区域中使用很少的辅助函数时。这是共识吗? letfn 是否应该在顶层使用(正如我之前所推荐的那样)?什么时候应该使用它?

最佳答案

letfn 用于相互递归的情况:

(letfn [(is-even? [n]
(if (zero? n)
true
(is-odd? (dec n))))
(is-odd? [n]
(if (zero? n)
false
(is-even? (dec n))))]
(is-even? 42))

;; => true

不要在顶层使用它。

此外,除非有非常具体的原因,否则不要在顶层以外的任何地方使用 defn 宏。它将扩展为 def 特殊形式,它将创建和实习全局变量。

关于Clojure 风格 : defn- vs. letfn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255798/

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