2010-10-25 19 views
14

Trong câu trả lời được chấp nhận cho một câu hỏi khác, Setting Clojure "constants" at runtime chức năng clojure constantly được sử dụng.Khi nào sử dụng `liên tục` trong clojure, các đối số của nó được đánh giá như thế nào và khi nào?

Định nghĩa của constantly trông giống như vậy:

(defn constantly 
    "Returns a function that takes any number of arguments and returns x." 
    {:added "1.0"} 
    [x] (fn [& args] x)) 

Chuỗi doc nói những gì nó làm nhưng không phải lý do tại sao người ta sẽ sử dụng nó.

Trong câu trả lời được đưa ra trong câu hỏi trước liên tục được sử dụng như sau:

(declare version) 

(defn -main 
    [& args] 
(alter-var-root #'version (constantly (-> ...))) 
(do-stuff)) 

Vì vậy, các chức năng được trả về bởi liên tục được đánh giá trực tiếp cho kết quả của nó. Tôi bối rối như thế nào điều này là hữu ích. Tôi có lẽ không hiểu làm thế nào x sẽ được đánh giá có và không được bao bọc trong 'liên tục'.

Khi nào tôi nên sử dụng constantly và tại sao cần thiết?

Trả lời

10

Chức năng constantly hữu ích khi API mong đợi một hàm và bạn chỉ muốn một hằng số. Đây là trường hợp trong ví dụ được cung cấp trong câu hỏi.

Hầu hết các chức năng alter-* (bao gồm alter-var-root) có chức năng, để cho phép người gọi sửa đổi điều gì đó dựa trên giá trị cũ của nó. Thậm chí nếu bạn chỉ muốn giá trị mới là 7 (bỏ qua giá trị cũ), bạn vẫn cần cung cấp một hàm (chỉ cung cấp 7 sẽ dẫn đến một nỗ lực để đánh giá nó, điều này sẽ thất bại). Vì vậy, bạn phải cung cấp một chức năng mà chỉ trả về 7. (constantly 7) chỉ tạo ra chức năng này, tiết kiệm công sức cần thiết để xác định nó.

Chỉnh sửa: Là phần thứ hai của câu hỏi, constantly là một hàm bình thường, vì vậy đối số của nó được đánh giá trước khi hàm liên tục được tạo. Vì vậy, (constantly @myref) luôn trả về giá trị được tham chiếu bởi myref tại thời điểm constantly được gọi, ngay cả khi nó được thay đổi sau đó.

Các vấn đề liên quan