Có điều gì đó mà tôi phải bỏ sót về macro luồng trong Clojure.Chênh lệch lẻ giữa các hàm được đặt tên và ẩn danh khi sử dụng macro luồng
Tôi cũng có bản đồ với các giá trị là bản đồ và tôi muốn tìm kiếm kết quả của một lần tra cứu khác. Hãy để bản đồ trở thành một đơn giản {:a {:b 2}}
- đầu tiên tôi muốn tìm kiếm khóa :a
, tức là sẽ mang lại {:b 2}
, sau đó tra cứu b
, kết quả là 2
. Chìa khóa cho lần tra cứu thứ hai cần phải là kết quả của một hàm.
((fn [x] (get x :b)) ({:a {:b 2} } :a))
=> 2
Ok, hãy làm cho nó dễ đọc hơn với macro luồng.
(-> {:a {:b 2} } :a (fn [x] (get x :b)))
I.e. áp dụng :a
làm hàm trên bản đồ, sau đó áp dụng một hàm khác. Vâng, điều này không làm việc: CompilerException java.lang.IllegalArgumentException: Parameter declaration :a should be a vector
Lạ lùng thay, nếu chức năng ẩn danh được chiết xuất với một tên một, sau đó nó hoạt động tốt:
(defn f [x] (get x :b))
(-> {:a {:b 2} } :a f)
=> 2
Hoặc thậm chí:
(def f (fn [x] (get x :b)))
(-> {:a {:b 2} } :a f)
=> 2
Tại sao có sự khác biệt giữa cách đặt tên và chức năng ẩn danh hoạt động?
Hmm, thú vị, cảm ơn. Tôi cần phải có được đầu của tôi xung quanh macro - rõ ràng là 'đối số đầu tiên cho mỗi subform' không có nghĩa là 'đối số đầu tiên của chức năng vô danh' - đó là cách tôi nghĩ ban đầu. –
vâng, macro rất theo nghĩa đen, do đó, nó thấy và thay đổi không phải là 'fn', nhưng là lệnh gọi thành' fn'. – noisesmith