що означає "нехай *" (нехай зірочка) означає в Elisp


Відповіді:


20

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


у наведеному вище прикладі є помилка друку, коли bдорівнює 5, оскільки вона пов'язана з глобальним a. Він повинен читати letзамістьlet*
1818

@jue: правильно; Дякую.
Дрю

Можна також запитати про функції, за допомогою яких F1 f.
DoMiNeLa10

@ DoMiNeLa10: Дійсно; гарна думка. Оскільки коментарі можна видалити будь-коли, я оновив відповідь, щоб згадати про це. Дякую.
Дрю

5

let*- це як рекурсивне letзначення:

(let* ((var1 VAL1)
       (var2 VAL2))
  ...)

це як

(let ((var1 VAL1))
  (let ((var2 VAL2))
    ...))

Тим самим використання великих літер для VAL1і VAL2вказує, що вони також можуть бути виразами.

Рекурсивне letзв’язування має наслідки, якщо VAL2насправді залежить від var1. Ефект уже описаний у відповіді Дрю .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.