let
バインディングを実装する方法は 2 つあります。まず、SICPから知られているように、ラムダ関数let
として実装できます。これは便利で簡単ですが、JVM では各ラムダ ( ) が個別のクラスに変換され、平均的なプログラムで何度も使用されるという事実を考慮すると、これは非常に高価に思えます。fn
let
次に、バインディングをローカル Java 変数let
に直接変換できます。これによりオーバーヘッドはほとんど発生しませんが、バインディングをスタックに格納すると言語のセマンティクスが壊れます。この場合、クロージャーの作成は不可能です。保存された値は、スタックの巻き戻しの直後に破棄されます。
では、Clojure で実際に使用されている実装は何ですか? Clojure ソース内の対応する行を参照していただければ幸いです。