2017-01-24 13 views
6

Tôi đang xem nguồn gốc của clojure.core:Về nguồn gốc của - >>

(defmacro ->> 
    [x & forms] 
    (loop [x x, forms forms] 
    (if forms 
     (let [form (first forms) 
      threaded (if (seq? form) 
         (with-meta `(~(first form) [email protected](next form) ~x) (meta form)) 
         (list form x))] 
     (recur threaded (next forms))) 
     x))) 

On line 7, tại sao không chỉ

(with-meta `([email protected] ~x) (meta form)) 

Trả lời

7

Đó là gần như tương đương, nhưng không hoàn toàn. Xem xét điều gì sẽ xảy ra nếu biểu mẫu (không chính xác) (). Như được viết, lỗi này được ghi nhận tại thời gian biên dịch bởi vì nó là bất hợp pháp để đánh giá (nil x). Với đơn giản hóa được đề xuất của bạn, lỗi sẽ được nhận thấy trong thời gian chạy hoặc có thể không bao giờ xảy ra nếu x xảy ra là hàm không có đối số.

Để lại một cách chính xác, nó cũng tốt hơn cho khả năng đọc, vì nó nhấn mạnh rằng đầu tiên của biểu mẫu sẽ được gọi, với phần còn lại làm đối số. Nó cũng là một đối xứng đẹp hơn với việc thực hiện ->.

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