2012-09-05 25 views
11

Trong khi cố gắng để giải quyết vấn đề 4Clojure "Universal Computation Engine" liên quan đến reimplementing thẩm định, tôi vô tình đã kết thúc gọi một cái gì đó như thế này:Biểu tượng Clojure làm gì khi được sử dụng làm chức năng?

(apply '/ '(16 8)) 

chứ không phải là mục đích:

(apply/'(16 8)) 

này có tác dụng phụ khó hiểu về việc trả lại 8, điều đó khiến tôi nghĩ rằng tôi đã sai lầm về toán học của mình.

Sau này tôi nhận ra lỗi của mình sau khi gỡ lỗi — Tôi đã không đánh giá biểu tượng / trước khi cố gọi nó — và vì vậy nhận ra rằng clojure.lang.Symbol phải triển khai clojure.lang.IFn. Nhưng việc triển khai thực hiện đó làm là gì? Tất cả những gì tôi có thể làm là trả lại nil với một đối số hoặc đối số thứ hai nếu được.

+0

bản sao có thể có của [Điều gì xảy ra khi tôi chuyển đối số cho biểu tượng Clojure?] (Http://stackoverflow.com/questions/8219305/what-happens-when-i-pass-arguments-to-a-clojure- ký hiệu) – amalloy

Trả lời

12

Ký hiệu tự nhìn lên trên bản đồ, nhiều như từ khóa. Xem Symbol's implementation:

… 
122 public Object invoke(Object obj) { 
123   return RT.get(obj, this); 
124 } 
125 
126 public Object invoke(Object obj, Object notFound) { 
127   return RT.get(obj, this, notFound); 
128 } 
… 

(.? RTclojure.lang.RT, đó không chỉ là về tất cả mọi thứ "RunTime")

Trong ví dụ được đưa ra, tra cứu được không (vì 16 không phải là một bản đồ), và do đó giá trị notFound (8) đang được trả lại.

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