2011-04-20 37 views
5

Tôi có một chức năng mà phải mất một chức năng và một số và trả về việc áp dụng các chức năng về số lượng, và một hàm cube:qua chức năng như các đối số trong clojure

(defn something [fn x] 
    (fn x)) 

(defn cube [x] 
    (* x x x)) 

Khi tôi gọi hàm như sau nó hoạt động:

(something cube 4) 

nhưng điều này trả về một lỗi:

(something Math/sin 3.14) 

Tuy nhiên, hoạt động này:

(something #(Math/sin %) 3.14) 

Giải thích là gì?

Trả lời

13

Math.sin không phải là chức năng! Nó là một phương thức trực tiếp từ Java, và không hiểu các quy tắc khác nhau mà các hàm Clojure phải tuân theo. Nếu bạn bọc nó trong một hàm, thì hàm đó có thể hoạt động như một proxy, chuyển các đối số tới phương thức "câm" và trả về các kết quả cho ngữ cảnh định hướng hàm "thông minh" của bạn.

+0

Cảm ơn, bây giờ tôi đã hiểu. Thực ra tôi đã cố hiểu các macro khi sự nhầm lẫn này xuất hiện. Bạn có thể giải thích dòng này cho tôi không? - Vì các macro không đánh giá các đối số của chúng, các tên hàm unquoted có thể được truyền cho chúng và các cuộc gọi đến các hàm có các đối số có thể được xây dựng. Định nghĩa chức năng không thể làm điều này và thay vào đó phải được thông qua các hàm ẩn danh bao bọc các cuộc gọi đến các hàm. ' – Pranav

+0

Sự nhầm lẫn của tôi là tôi đã chuyển một cách rõ ràng một chức năng không được kiểm soát 'khối lập phương' thành 'cái gì đó' và nó hoạt động. – Pranav

+1

Bạn có thể hỏi câu hỏi này như một câu hỏi SO thực sự hơn là trong các bình luận? Các định dạng ở đây là khá mờ nhạt, và tôi không thực sự muốn thêm "một câu trả lời" cho một câu hỏi hoàn toàn không liên quan. – amalloy

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