我编写了以下函数来打印一个值 10 次:
(defn test-let []
(loop [index 0]
(when (< index 10)
(let [x 2]
(println "Value of x: " x))
(recur (inc index)))))
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否因为let在 内部创建了loop10 个变量(代表值 2)和只有 1 个符号(x代表保存值的变量)?2
如果创建了 10 个变量,那么它们什么时候有资格进行垃圾回收?
我认为你混淆了值和变量。在上面的示例中,循环中每次都会创建10 个值x,并且每次都会绑定到该值。在 Clojure 中,由表单创建的局部符号(也称为名称)let不是变量(例如,像由 所创建的那些顶级符号def)。在 a 内部let,符号直接绑定到值。有关更多信息,请参阅https://clojure.org/reference/special_forms#let。Clojure 编译器会进行局部变量清除,一旦控制点离开局部作用域,就会生成代码来删除对局部值的引用。有关更多详细信息,请参阅https://clojure.org/reference/compilation#_locals_clearing 。在您的特定情况下,它的值2可能并不重要,因为 Clojure 将直接使用原始值。我想您是在询问更一般的情况,其中绑定的值x可能比原始值更大。