Tôi đã sử dụng let
trước đó, nhưng không bao giờ sử dụng let*
những gì let*
(để dấu hoa thị) có nghĩa là trong elisp?
fyi cái này thật khó để google vì dấu hoa thị.
Tôi đã sử dụng let
trước đó, nhưng không bao giờ sử dụng let*
những gì let*
(để dấu hoa thị) có nghĩa là trong elisp?
fyi cái này thật khó để google vì dấu hoa thị.
Câu trả lời:
Điều đó có nghĩa là khi có nhiều hơn một ràng buộc, các biến được liên kết liên tục, do đó mỗi biến có thể phụ thuộc vào các giá trị được ràng buộc với các giá trị được ràng buộc trước nó, tức là các biến đi trước nó trong các let*
ràng buộc.
Đối với let
(không có dấu hoa thị), không có ràng buộc nào có thể được giả định xảy ra trước bất kỳ ràng buộc nào khác (về nguyên tắc, các biến có thể được ràng buộc song song).
Vì vậy, (let ((a 42) (b a))...b)
có thể gây ra lỗi vì nó cố gắng liên kết b
với giá trị của a
, và a
(ít nhất là cụ thể a
bị ràng buộc trong điều này let
) không thể được coi là đã bị ràng buộc với một giá trị.
[Nếu một số biến khác (ví dụ toàn cầu) a
bị ràng buộc với một giá trị, ví dụ: 5
thì let
biểu thức đó sẽ liên kết (cục bộ) của nó a
với 42
và liên kết b
với giá trị của toàn cục a
, tức là , 5
.]
Nhưng (let* ((a 42) (b a))...b)
trả về 42
vì a
bị ràng buộc 42
và sau đó b
bị ràng buộc với giá trị của a
.
Xem hướng dẫn Elisp, nút Biến cục bộ .
Cập nhật, từ lời nhắc của @ DoMiNeLa10 trong một bình luận:
Ngoài hướng dẫn, bạn cũng có thể sử dụng các lệnh trợ giúp . Trong tất cả các cách khác nhau để "hỏi Emacs" , chúng là một trong những cách đầu tiên để học và hữu ích nhất.
Và cho C-h f let*
chúng tôi biết, ngắn gọn:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
Mặc dù không có gì sai khi hỏi ở đây, bạn sẽ tự giúp mình nếu bạn hỏi Emacs những câu hỏi như vậy. Chỉ cần sử dụng C-h i
để mở trình duyệt Thông tin hướng dẫn sử dụng, chọn Elisp
hướng dẫn sử dụng và sử dụng i let*
để tra cứu let*
trong chỉ mục (khi hoàn thành). Điều đó sẽ đưa bạn trực tiếp đến nút bao gồm điều này.
(Và hướng dẫn thường bao gồm những điều tốt hơn sẽ được thực hiện ở đây, vì rất nhiều thời gian và công sức, bởi hàng ngàn người đóng góp, đã đi vào làm cho nó đúng: chính xác và đầy đủ.)
Bạn cũng có thể tìm kiếm trang web này cho các câu hỏi và câu trả lời sử dụng thẻ let-binding
: Chỉ cần đặt [let-binding]
vào trường tìm kiếm. (Tôi sẽ làm điều đó ngay bây giờ, để xem câu hỏi này có lẽ là trùng lặp không ...)
F1 f
.
let*
giống như một let
ý nghĩa đệ quy :
(let* ((var1 VAL1)
(var2 VAL2))
...)
giống như
(let ((var1 VAL1))
(let ((var2 VAL2))
...))
Do đó, việc sử dụng chữ in hoa cho VAL1
và VAL2
chỉ ra rằng chúng cũng có thể là biểu thức.
Liên let
kết đệ quy có hậu quả nếu VAL2
phụ thuộc thực sự vào var1
. Hiệu ứng đã được mô tả trong câu trả lời của Drew .
b
bằng 5 vì nó bị ràng buộc với toàn cầua
. Nó nên đọclet
thay vìlet*