2011-10-20 29 views
8

Chúng ta cần ngoặc ở đây để thực hiện cuộc gọi của chức năng ẩn danhgọi Chức năng in -> luồng vĩ mô

user=> (-> [1 2 3 4] (conj 5) (#(map inc %))) 
(2 3 4 5 6) 

Tại sao không có nhu cầu ngoặc xung quanh map+fmap+ trong các ví dụ?

user=> (def map+ #(map inc %)) 
#'user/map+ 
user=> (-> [1 2 3 4] (conj 5) map+) 
(2 3 4 5 6) 

user=> (defn fmap+ [xs] (map inc xs)) 
#'user/fmap+ 
(-> [1 2 3 4] (conj 5) fmap+) 
(2 3 4 5 6) 

Trả lời

16

Các documentation cho tình trạng ->->> macro rằng các hình thức sau khi thông số đầu tiên được gói vào danh sách nếu họ không danh sách rồi. Vì vậy, câu hỏi là tại sao điều này không hoạt động cho các hình thức #()(fn ..)? Lý do là cả hai biểu mẫu đều ở dạng danh sách tại thời điểm macro mở rộng.

Ví dụ

(-> 3 (fn [x] (println x))) 

được hình thức (fn [x] ...) lúc mở rộng, vì vậy vĩ mô cho rằng "rất lớn, đó là một danh sách, tôi sẽ chỉ cần chèn 3 ở vị trí thứ hai của danh sách (fn ..)." Gọi macroexpansion, đây là những gì chúng tôi nhận được:

(fn 3 [x] (println x)) 

khóa học nào không hoạt động. Tương tự như vậy cho #():

(-> 3 #(println %)) 

được mở rộng để

(fn* 3 [p1__6274#] (println p1__6274#)) 

Đó là lý do tại sao chúng ta cần các dấu ngoặc thêm.

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