apa arti "let *" (biarkan asterisk) di elisp

12

Saya sudah pernah menggunakan letsebelumnya, tetapi tidak pernah menggunakan let* apa artinya let*(biarkan asterisk) di elisp?

fyi ini sulit untuk google karena tanda bintang.

prajurit amerika-ninja
sumber

Jawaban:

17

Ini berarti bahwa ketika ada lebih dari satu pengikatan variabel terikat secara berurutan, sehingga masing-masing dapat bergantung pada nilai yang terikat pada yang terikat sebelumnya, yaitu, yang datang sebelum itu di let*binding.

Untuk let(tanpa tanda bintang), tidak ada ikatan yang dapat dianggap terjadi sebelum yang lain (variabel dapat, pada dasarnya, terikat secara paralel).

Jadi (let ((a 42) (b a))...b)dapat meningkatkan kesalahan karena mencoba untuk mengikat bke nilai a, dan a(setidaknya ayang terikat dalam hal ini let) tidak dapat diasumsikan telah terikat pada suatu nilai.

[Jika beberapa variabel lain (misalnya global) a terikat pada suatu nilai, misalnya, 5maka letekspresi itu akan mengikatnya (lokal) ake 42dan mengikat bke nilai global a, yaitu 5,.]

Tetapi (let* ((a 42) (b a))...b)pengembalian 42karena aterikat 42 dan kemudian b terikat dengan nilai a.

Lihat manual Elisp, simpul Variabel Lokal .


Perbarui, dari pengingat @ DoMiNeLa10 dalam komentar:

Selain manual, Anda juga dapat menggunakan perintah bantuan . Dari semua berbagai cara untuk "bertanya Emacs" , mereka adalah yang pertama belajar dan yang paling berguna.

Dan untuk C-h f let*memberitahu kita, secara ringkas:Each VALUEFORM can refer to the symbols already bound by this VARLIST.


Meskipun tidak ada yang salah dengan bertanya di sini, Anda akan melakukan sendiri nikmat jika Anda bertanya Emacs pertanyaan seperti itu. Cukup gunakan C-h iuntuk membuka Info browser dari manual, pilih Elispmanual, dan gunakan i let*untuk mencari let*di indeks (dengan selesai). Itu akan membawa Anda langsung ke node yang mencakup ini.

(Dan manual biasanya membahas hal-hal yang lebih baik daripada yang akan dilakukan di sini, karena banyak waktu dan usaha, oleh ribuan kontributor, telah diusahakan untuk memperbaikinya: benar dan lengkap.)


Anda juga dapat mencari di situs ini untuk pertanyaan dan jawaban yang menggunakan tag let-binding: Cukup masukkan [let-binding]bidang pencarian. (Saya akan melakukannya sekarang, untuk melihat apakah pertanyaan ini mungkin merupakan duplikat ...)

Drew
sumber
ada kesalahan ketik pada contoh di atas, ketika bsama dengan 5 karena terikat ke global a. Itu seharusnya dibaca letsebagai gantilet*
jue
@ jo: Benar; Terima kasih.
Drew
Mungkin juga untuk bertanya tentang fungsi dengan F1 f.
DoMiNeLa10
@ DoMiNeLa10: Memang; Poin yang bagus. Karena komentar dapat dihapus kapan saja saya telah memperbarui jawaban untuk menyebutkan ini. Terima kasih.
Drew
4

let*seperti letmakna rekursif :

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

seperti

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

Dengan demikian penggunaan huruf kapital untuk VAL1dan VAL2menunjukkan bahwa itu juga bisa menjadi ekspresi.

letBinding rekursif memiliki konsekuensi jika VAL2tergantung pada var1. Efeknya sudah dijelaskan dalam jawaban Drew .

Tobias
sumber