gpt4 book ai didi

clojure - 每次调用 `letfn` 时, `sqrt` 中定义的绑定(bind)都会更新吗?

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

假设定义了 absavg:

(defn sqrt [x]
(letfn [(s [guess]
(if (good-enough? guess)
guess
(s (improve guess))))
(good-enough? [guess]
(< (abs (- (square guess) x)) 0.0001))
(improve [guess]
(avg (/ x guess) guess))]
(s 1.0)))

请忽略我在这里重新发明轮子。 :) 这仅作为示例。

如果是这样,有没有办法解决这个问题,这样每次调用函数时名称就不会一次又一次地绑定(bind),并且不会在函数外部引入更多名称?

最佳答案

Will the functions defined in letfn be redefined every time sqrt is called?

是的。

每次输入 sqrt 函数时,sgood-enough绑定(bind)都会被重新创建。他们所束缚的事物被重新构建。

  • sgood-enough 函数(实际上是 fn 特殊形式)编译一次,当 (defn sqrt ... ) 为已执行。
  • 每次调用 sqrt 时,它们都会在 x 上闭合。
  • 闭包可以在 JVM 上作为内部类实现符合 IFn 接口(interface)。
  • 每次 sqrt 时都会构造闭包/函数对象输入,尽管它们所例证的类已经编译了很长时间。
<小时/>

这取决于您所说的“重新定义”的含义。我想不会,但是绑定(bind)两侧的元素都被更新了。所以现在我这么认为。

<小时/>

is there a more idiomatic way to write the square root function?

是的。

在 JVM 上...

(defn sqrt [x] (Math/sqrt x))

(sqrt 2);1.4142135623730951

关于clojure - 每次调用 `letfn` 时, `sqrt` 中定义的绑定(bind)都会更新吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459330/

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