Во-первых, у elisp есть отдельные привязки переменных и функций, поэтому некоторые ловушки динамического определения области не актуальны.
Во-вторых, вы все равно можете использовать setq
для установки переменных, но набор значений не сохраняетсявыход из динамической области видимости, в которой это делается. По сути, это не отличается от лексического определения области, с той лишь разницей, что при динамическом определении объема setq в функции, которую вы вызываете, может влиять на значение, которое вы видите после вызова функции.
Есть lexical-let
, макрос, который (по существу) имитирует лексические привязки (я полагаю, что он делает это путем обхода тела и изменения всех вхождений переменных с лексическим разрешением на имя с генсимметричной симуляцией, в конечном счете отменяя символы)надо.
Я бы сказал "напиши код как обычно".Бывают случаи, когда динамическая природа elisp вас кусает, но я обнаружил, что на практике это на удивление редко.
Вот пример того, что я говорил о setq и динамически связанных переменных (недавно оцененныхв ближайшем буфере scratch ):
(let ((a nil))
(list (let ((a nil))
(setq a 'value)
a)
a))
(value nil)