2013-04-11 32 views
6

Tôi đã xem qua src của chuỗi? fn và có một vài câu hỏi. Dưới đây là nguồn gốc của các string? fn -câu hỏi về nguồn gốc của chuỗi?

(def 
^{:arglists '([x]) 
    :doc "Return true if x is a String" 
    :added "1.0" 
    :static true} 
string? (fn ^:static string? [x] (instance? String x))) 
  1. gì đưa ra một fn siêu dữ liệu tĩnh làm gì?
  2. Tại sao siêu dữ liệu tĩnh được cung cấp hai lần, không đủ để chỉ định nó cho fn hoặc cho var?
  3. Tại sao fn ẩn danh có tên?
+3

1. đã được trả lời tại đây: http://stackoverflow.com/questions/7552632/what-does-static-do-in-clojure –

Trả lời

4

Để có câu trả lời cho 1. và 2., xem nhận xét của d.j.sheldrick về câu hỏi. Trả lời cho 3 .:

Thứ nhất, mặc dù điều này không có liên quan ở đây, các hàm được đặt tên có thể tự giới thiệu bằng tên của chúng. Điều này cho phép họ tự trở lại làm giá trị hoặc tự gọi mình thông qua cơ chế gọi thông thường thay vì recur lên đầu. Quan trọng hơn, đây là chiến lược tự gọi chính xác cho các chức năng tạo ra các seqs lười biếng; Tôi đã đi vào lý do tại sao in an earlier SO answer (xem phần sau "Làm thế nào đến bạn có thể quấn các cuộc gọi đệ quy trong một chuỗi lười biếng ..." khối báo giá).

Thứ hai, các hàm được biên dịch thành các lớp JVM. Các lớp được đặt tên bởi trình biên dịch Clojure dựa trên không gian tên trong đó hàm được định nghĩa nếu hàm không được đặt tên; nếu không tên được sử dụng để tạo ra một tên có ý nghĩa hơn cho lớp. Điều này rất hữu ích để gỡ lỗi, vì nó làm cho các dấu vết ngăn xếp dễ hiểu hơn.