Я використовував let
раніше, але ніколи не використовував, let*
що означає let*
(нехай зірочка) означає в Elisp?
fyi цього важко було в Google через зірочку.
Я використовував let
раніше, але ніколи не використовував, let*
що означає let*
(нехай зірочка) означає в Elisp?
fyi цього важко було в Google через зірочку.
Відповіді:
Це означає, що коли є більше одного прив'язки, змінні пов'язані послідовно, так що кожна може залежати від значень, пов'язаних з тими, які пов'язані перед нею, тобто тих, що надходять до неї у 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*