Я використовував 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*