Я вижу два способа реализации привязок let
. Во-первых, как известно из SICP, let
может быть реализовано как лямбда-функция. Это удобно и просто, но с учетом того факта, что каждая лямбда (fn
) переводится в отдельный класс в JVM, а количество раз let
используется в средней программе, это кажется очень и очень дорогостоящим.
Во-вторых, привязки let
могут быть переведены непосредственно в локальные переменные Java . Это дает очень небольшие накладные расходы, но сохранение привязок в стеке нарушает семантику языка: в этом случае создание закрытий просто невозможно - сохраненные значения будут уничтожены сразу после разворачивания стека.
Итак, какова фактическая реализация, используемая в Clojure? Понятно, что указывается на соответствующие строки в Clojure.