let
bóng các mục cấp đầu Var x
với một địa phương x
. let
không tạo ra một Var hoặc ảnh hưởng đến Var toplevel; nó liên kết một số biểu tượng sao cho các tham chiếu cục bộ tới biểu tượng đó sẽ được thay thế bằng giá trị let
. let
có phạm vi từ vựng, do đó các ràng buộc của nó chỉ hiển thị trong chính biểu mẫu let
(không phải trong các hàm được gọi từ trong số let
).
binding
tạm thời (chủ đề cục bộ) thay đổi giá trị của biến thể phức tạp là 01 x
, đó là tất cả. Nếu ràng buộc let
, binding
sẽ không nhìn thấy khi quyết định giá trị nào thay đổi (và các liên kết của let
không phải là vars và không thể thay đổi được, do đó 'điều tốt hoặc nó sẽ cho bạn lỗi'). Và binding
sẽ không che dấu let
. binding
có phạm vi động, vì vậy ảnh hưởng của nó đối với các Vars toplevel được hiển thị trong biểu mẫu binding
và trong bất kỳ hàm nào được gọi từ bên trong biểu mẫu binding
.
Tiếp cận giá trị của đồng bằng cũ x
sẽ cung cấp cho bạn bất cứ điều gì là ở phía trên cùng của ngăn xếp của các ràng buộc, một trong hai lồng nhau nhất let
giá trị -bound của x
(hoặc chức năng paramater gọi x
, hoặc một số giá trị x
được thay thế bằng nếu bạn sử dụng macro của riêng bạn hoặc các khả năng khác.) và chỉ sử dụng giá trị hiện tại của biến thái to 1 x
nếu không có ràng buộc nào khác.
Ngay cả khi biến dạng tobị che khuất bởi let
- x
, bạn luôn có thể truy cập vào Biến dạng thông qua @#'x
. Hãy thử phiên bản này, có thể nó sẽ có ý nghĩa hơn:
(def x 1)
(defn dummy-fn2[]
(println "x from dummy-fn2:" x)
(+ x 1))
(defn dummy-fn[]
(println "entering function:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x 100]
(println "after let:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x (dummy-fn2)]
(println "after let and dummy-fn2:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(binding [x 888]
(println "after binding:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x (dummy-fn2)]
(println "after binding and dummy2:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---"))))))
Cung cấp:
entering function: 1
var x: 1
x from dummy-fn2: 1
---
after let: 100
var x: 1
x from dummy-fn2: 1
---
x from dummy-fn2: 1
after let and dummy-fn2: 2
var x: 1
x from dummy-fn2: 1
---
after binding: 2
var x: 888
x from dummy-fn2: 888
---
x from dummy-fn2: 888
after binding and dummy2: 889
var x: 888
x from dummy-fn2: 888
---
Nguồn
2009-11-21 07:31:44
Để tránh lặp lại những tài liệu hướng dẫn, có lẽ bạn có thể mô tả những gì bạn mong đợi và lý do tại sao nó khác với những gì thực sự xảy ra . –