每次调用`sqrt`时,`letfn`中定义的绑定是否会被更新?

dam*_*onh 5 clojure

只要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)))
Run Code Online (Sandbox Code Playgroud)

请忽略一下我在这里重新发明轮子.:)这只是一个例子.

如果是这样,有没有办法绕过这个,所以每次调用函数时都不会一次又一次地绑定名称,并且不在函数外引入更多名称?

Thu*_*ail 3

中定义的函数letfn每次sqrt调用都会重新定义吗?

是的。

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

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

这取决于您所说的重新定义是什么意思。我以为不是,但是装订两侧的元素都更新了。所以现在我也这么认为。


有没有更惯用的方法来编写平方根函数?

是的。

在 JVM 上...

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

(sqrt 2);1.4142135623730951
Run Code Online (Sandbox Code Playgroud)