2012-07-19 40 views
5

Tôi đang thảo luận về việc đóng cửa với một người bạn và anh ta nghĩ rằng (partial + 5) là đóng cửa. Nhưng tôi cho rằng việc đóng là một hàm đóng trên biến miễn phí, ví dụ:là một phần chức năng này là một đóng cửa?

(let [a 10] 
    (defn func1 [x] (+ x a)) 
) 

thì func1 là đóng. Nhưng trong trường hợp này, 5 không phải là biến miễn phí. Vậy câu trả lời đúng là gì?

+0

Trong khi câu trả lời được chấp nhận là chính xác về mặt thực hiện, tôi cho rằng nó không nên được coi là một đóng cửa, mà là "chỉ" một phần ứng dụng. Việc sử dụng đóng cửa là chi tiết triển khai nội bộ không được hiển thị trực tiếp với người gọi. – user2864740

Trả lời

7

partial sử dụng dấu đóng để thực hiện chức năng một phần. Kiểm tra mã của partial bằng cách sử dụng (source partial) trong repl và bạn sẽ thấy rằng nó sử dụng bao đóng.

(defn partial 
    "Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args." 
    {:added "1.0"} 
    ([f arg1] 
    (fn [& args] (apply f arg1 args))) 
    ([f arg1 arg2] 
    (fn [& args] (apply f arg1 arg2 args))) 
    ([f arg1 arg2 arg3] 
    (fn [& args] (apply f arg1 arg2 arg3 args))) 
    ([f arg1 arg2 arg3 & more] 
    (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) 
+0

Tại sao nó được viết như vậy? Tôi chỉ đang học ngay bây giờ và [f arg1] có vẻ dư thừa vì có triển khai "varargs" (một với & nhiều hơn nữa) – themistoklik

+0

Đặt cược an toàn sẽ là tối ưu hóa các trường hợp phổ biến nhất – Sushisource

0

(partial + 5) là một hàm ẩn danh hoặc "lambda".

Chức năng ẩn danh thường được gọi là "đóng cửa" nhưng đó là lạm dụng thuật ngữ; xem thảo luận trong "What is the difference between a 'closure' and a 'lambda'?"


[¹] Có lẽ bởi vì trong ngôn ngữ phổ biến nhất mà hỗ trợ họ, đóng cửa và chức năng ẩn danh được tạo ra bằng cách sử dụng tính năng cùng một ngôn ngữ - điều này làm cho họ không thể nhận rỏ ở cái nhìn đầu tiên.

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