Không có gì để cho Let * * (hãy để dấu hoa thị) trong elisp


11

Tôi đã sử dụng lettrướ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:


16

Đ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 bvới giá trị của a, và a(ít nhất là cụ thể abị 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ụ: 5thì letbiểu thức đó sẽ liên kết (cục bộ) của nó avới 42và liên kết bvới giá trị của toàn cục a, tức là , 5.]

Nhưng (let* ((a 42) (b a))...b)trả về 42abị 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 Elisphướ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 ...)


có một lỗi đánh máy trong ví dụ trên, khi bbằng 5 vì nó bị ràng buộc với toàn cầu a. Nó nên đọc letthay vìlet*
Jue

@jue: Phải; cám ơn.
vẽ

Cũng có thể hỏi về các chức năng với F1 f.
DoMiNeLa10

@ DoMiNeLa10: Thật vậy; điểm tốt. Vì ý kiến ​​có thể bị xóa bất cứ lúc nào tôi đã cập nhật câu trả lời để đề cập đến điều này. Cám ơn.
vẽ

4

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 VAL1VAL2chỉ ra rằng chúng cũng có thể là biểu thức.

Liên letkết đệ quy có hậu quả nếu VAL2phụ thuộc thực sự vào var1. Hiệu ứng đã được mô tả trong câu trả lời của Drew .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.