我可以看到两种实现let
绑定的方法。首先,从SICP 可知,let
可以实现为lambda 函数。这很方便和简单,但考虑到每个 lambda( fn
) 在 JVM 中被翻译成单独的类以及let
在普通程序中使用的次数,这似乎非常非常昂贵。
其次,let
绑定可以直接转换为本地 Java 变量。这几乎没有开销,但是将绑定存储在堆栈上会破坏语言语义:在这种情况下,创建闭包是不可能的 - 保存的值将在堆栈展开后立即被销毁。
那么 Clojure 中使用的实际实现是什么?指向 Clojure 源代码中的相应行表示赞赏。