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