Tôi cố gắng để hiểu các biến động và chức năng ràng buộc vì vậy tôi cố gắng này (clojure 1.3):clojure và ^: năng động
user=> (defn f []
(def ^:dynamic x 5)
(defn g [] (println x))
(defn h [] (binding [x 3] (g)))
(h))
#'user/f
user=> (f)
5
nil
Bối rối, tôi đã cố gắng mã này hơi đơn giản:
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn g [] (println y))
#'user/g
user=> (defn h [] (binding [y 3] (g)))
#'user/h
user=> (h)
3
nil
gì khác nhau giữa hai đoạn mã là gì? Tại sao ví dụ thứ hai lại làm việc nhưng ví dụ đầu tiên lại không?
Gợi ý: Tôi chỉ nhận ra rằng các công việc sau (vẫn không hoàn toàn hiểu tại sao):
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn f [] (defn g [] (println y)) (defn h [] (binding [y 3] (g))) (h))
#'user/f
user=> (f)
3
nil
user=>
Tôi hiểu ưu/nhược điểm của ràng buộc. Tôi cũng nhận ra ví dụ mã đầu tiên là mã clojure bất thường. Những gì tôi không hiểu là tại sao nó không hoạt động (với 1,3, repl tươi). – Kevin
Tôi gặp khó khăn khi nhìn thấy khi nào bạn muốn ràng buộc! Nó trông anathema đến cách chức năng. Tôi đang thiếu gì? – Hendekagon
@Hendekagon - có thể xứng đáng là một câu hỏi SO theo đúng nghĩa của nó. Nhưng tôi đã thấy nó hữu ích như một cách bổ sung để chuyển ngữ cảnh tròn trong khi gỡ rối/làm việc tại REPL - nếu bạn làm điều này theo cách hoàn toàn chức năng thì bạn sẽ cần phải tạo các tham số mới trong suốt một cuộc gọi (có khả năng rất dài) đồ thị. – mikera