使用“let”在循环内总共创建了多少个变量

Dee*_*ire 2 clojure

我编写了以下函数来打印一个值 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)

我的问题是:

  1. 是否因为let在 内部创建了loop10 个变量(代表值 2)和只有 1 个符号(x代表保存值的变量)?2

  2. 如果创建了 10 个变量,那么它们什么时候有资格进行垃圾回收?

dor*_*rab 5

我认为你混淆了值和变量。在上面的示例中,循环中每次都会创建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可能比原始值更大。