Saya sudah pernah menggunakan let
sebelumnya, tetapi tidak pernah menggunakan let*
apa artinya let*
(biarkan asterisk) di elisp?
fyi ini sulit untuk google karena tanda bintang.
Saya sudah pernah menggunakan let
sebelumnya, tetapi tidak pernah menggunakan let*
apa artinya let*
(biarkan asterisk) di elisp?
fyi ini sulit untuk google karena tanda bintang.
Jawaban:
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 b
ke nilai a
, dan a
(setidaknya a
yang 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, 5
maka let
ekspresi itu akan mengikatnya (lokal) a
ke 42
dan mengikat b
ke nilai global a
, yaitu 5
,.]
Tetapi (let* ((a 42) (b a))...b)
pengembalian 42
karena a
terikat 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 i
untuk membuka Info browser dari manual, pilih Elisp
manual, 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 ...)
F1 f
.
let*
seperti let
makna rekursif :
(let* ((var1 VAL1)
(var2 VAL2))
...)
seperti
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Dengan demikian penggunaan huruf kapital untuk VAL1
dan VAL2
menunjukkan bahwa itu juga bisa menjadi ekspresi.
let
Binding rekursif memiliki konsekuensi jika VAL2
tergantung pada var1
. Efeknya sudah dijelaskan dalam jawaban Drew .
b
sama dengan 5 karena terikat ke globala
. Itu seharusnya dibacalet
sebagai gantilet*