Я использовал let
раньше, но никогда не использовал let*
то, что let*
(пусть звездочка) означает в elisp?
К сожалению, это было трудно гуглить из-за звездочки.
Я использовал let
раньше, но никогда не использовал let*
то, что let*
(пусть звездочка) означает в elisp?
К сожалению, это было трудно гуглить из-за звездочки.
Ответы:
Это означает, что когда существует более одной привязки, переменные связываются последовательно, так что каждая из них может зависеть от значений, привязанных к тем, которые привязаны перед ней, то есть к тем, которые предшествуют ей в let*
привязках.
Для let
(без звездочки) нельзя предположить, что ни одна из привязок происходит раньше, чем любая другая (переменные в принципе могут быть связаны параллельно).
Таким образом, (let ((a 42) (b a))...b)
может возникнуть ошибка, потому что он пытается привязать b
к значению a
, и a
(по крайней мере, конкретное, a
что связано в этом let
) нельзя предполагать, что он был привязан к значению.
[Если какой -либо другой (например , глобальная) переменная a
связана со значением, например, 5
, то это let
выражение будет связывать его (локальный) , a
чтобы 42
и привязать b
к значению глобальной a
, то есть 5
.]
Но (let* ((a 42) (b a))...b)
возвращает, 42
потому что a
привязывается к, 42
а затем b
привязывается к значению a
.
См. Руководство Elisp, узел Локальные переменные .
Обновление от напоминания @ DoMiNeLa10 в комментарии:
В дополнение к руководству вы также можете использовать команды справки . Из всех различных способов «спросить Emacs» они являются одними из первых и наиболее полезными.
И для C-h f let*
говорит нам, кратко:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Хотя нет ничего плохого в том, чтобы спрашивать здесь, вы бы сделали себе одолжение, если бы задавали Emacs такие вопросы. Просто используйте, C-h i
чтобы открыть информационный браузер руководств, выберите Elisp
руководство и используйте i let*
для поиска let*
в указателе (с завершением). Это приведет вас прямо к узлу, который покрывает это.
(И руководство обычно охватывает вещи лучше, чем будет сделано здесь, поскольку тысячи участников приложили много времени и усилий, чтобы сделать это правильно: правильно и полно.)
Вы также можете искать на этом сайте вопросы и ответы, которые используют тег let-binding
: Просто [let-binding]
введите в поле поиска. (Я сделаю это сейчас, чтобы проверить, не является ли этот вопрос дубликатом ...)
F1 f
.
let*
это как рекурсивное let
значение:
(let* ((var1 VAL1)
(var2 VAL2))
...)
как
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Таким образом, использование заглавных букв для VAL1
и VAL2
указывает, что они также могут быть выражениями.
Рекурсивное let
связывание имеет последствия, если VAL2
зависит от var1
. Эффект уже описан в ответе Дрю .
b
равно 5, потому что он связан с глобальнымa
. Это следует читатьlet
вместоlet*