2013-03-13 24 views
5

Tôi đang học Clojure. Tuy nhiên, tôi không có sự hiểu biết tốt cho ngôn ngữ và triết lý.Sự khác biệt giữa toán tử dấu chấm và cuộc gọi có tên đủ điều kiện trong Clojure

Nhưng tôi muốn làm quen với ngôn ngữ hơn. Do đó Tôi đã bắt đầu đọc tài liệu API lõi của Clojure và tìm thấy một số nội dung thú vị trong mã nguồn clojure.core/get.

(defn get 
    "Returns the value mapped to key, not-found or nil if key not present." 
    {:inline (fn [m k & nf] `(. clojure.lang.RT (get ~m ~k [email protected]))) 
    :inline-arities #{2 3} 
    :added "1.0"} 
    ([map key] 
    (. clojure.lang.RT (get map key))) 
    ([map key not-found] 
    (. clojure.lang.RT (get map key not-found)))) 

Để nhận giá trị bằng mã khóa đã cho, mã này sử dụng chức năng clojurelang.RT/get. Toán tử dấu chấm cuộc gọi mã - (. clojure.lang.RT (get map key)).

Câu hỏi của tôi là lý do tác giả viết (. clojure.lang.RT (get map key)) thay vì (clojure.lang.RT/get map key).

Có sự khác biệt về kỹ thuật nào không? hoặc bất kỳ lợi ích nào?

+0

Cú pháp 'classname/method' đã được xác định trước định nghĩa chưa? Tôi đoán là 'clojure.lang.RT/get' sẽ là lỗi cú pháp tại thời điểm này trong quá trình biên dịch. – ToBeReplaced

+0

'' mã clojure.core'' có lẽ không phải là một nơi tốt để bắt đầu hiểu triết lý ngôn ngữ, vì nó có xu hướng sử dụng các biểu mẫu mức thấp nhất. Bạn nên xem các thư viện được thiết lập tốt hơn như đổ chuông cho một trừu tượng HTTP sạch (https://github.com/mmcgrana/ring/) hoặc compojure cho một DSL định tuyến (https://github.com/weavejester/compojure) – sw1nn

Trả lời

7

Dấu chấm trong Clojure được sử dụng cho máy chủ interop (với lớp Java clojure.lang.RT trong trường hợp này). Biểu mẫu thành ngữ cho phương pháp tĩnh là (Classname/staticMethod args*) nhưng được mở rộng thành một cuộc gọi trên biểu mẫu đặc biệt .. Trong trường hợp của hàm get, về cơ bản bạn đang xem xét một phần của việc thực hiện Clojure. Không có lý do tại sao mã Clojure cấp thấp hơn sẽ sử dụng macro cấp cao hơn - vì vậy nó sử dụng trực tiếp biểu mẫu ..

Hãy nhìn vào các tài liệu tại địa chỉ: http://clojure.org/java_interop

Các hình thức ngữ là ở phía trên và bên dưới, bạn có thể tìm thấy cách họ đang mở rộng sang các cuộc gọi trên các nhà điều hành chấm. Đây là bit liên quan cho các phương pháp tĩnh:

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
Các vấn đề liên quan