2012-06-08 25 views
13

Có lẽ bạn có thể giúp tôi tìm điều này trong tài liệu. Tôi đang sử dụng pound-quote để có thể vượt qua các tên hàm không được đánh giá trước khi thực hiện. Ví dụ:Trích dẫn bảng Anh (hash-quote, # ') trong Clojure có chạy các hàm phân giải và ký hiệu không?

(#'cons 1()) 
;(1) 

(defn funcrunner [func a b] 
    (func a b)) 

(funcrunner cons 'a()) 
;(a) 

(funcrunner 'cons 'a()) 
'() 

(funcrunner #'cons 'a()) 
;(a) 

#'cons 
;#'clojure.core/cons 

(resolve (symbol 'cons)) 
;#'clojure.core/cons 

Tôi đoán đây là macro trình đọc.

Câu hỏi của tôi là (a) Dấu ngoặc kép (# ') viết tắt là gì? (b) Bạn có thể giải thích nó đang làm gì không? (c) Bạn có thể định vị nó trong tài liệu không? (d) Nó có thực sự viết tắt cho các chức năng giải mã và biểu tượng không?

PS - Đối với những người không ở Hoa Kỳ - # còn được gọi là 'băm' hoặc 'băm chéo'.

PPS - Tôi biết ví dụ của mình khiến nhu cầu này hơi dư thừa. Tôi quan tâm để biết nếu điều này là hoàn toàn dư thừa hoặc có trường hợp sử dụng cụ thể.

+0

Xem thêm: http://stackoverflow.com/questions/9113387/explanation-about-symbols-and-vars-and-their-differences-in-clojure –

Trả lời

26

#' là macro trình đọc mở rộng đến (var foo). Những gì bạn đang làm ở đây không phải là đi qua các hàm không được đánh giá, bạn đang truyền xung quanh các vars chứa các hàm. Lý do làm việc này theo cách nó là vì vars là chức năng mà nhìn lên giá trị chứa của họ và gọi nó là:

user=> (defn foo [x] (+ x 10)) 
#'user/foo 
user=> (#'foo 10) 
20 
user=> ((var foo) 10) 
20 

Chú ý rằng khi tôi đã xác định chức năng, một var được trả lại. Nó trông giống như những gì bạn đã làm! :)

+2

Anthony Grimes! Tôi yêu những gì bạn đã làm trong cộng đồng Clojure. Thật vinh dự khi được bạn trả lời câu hỏi này. – hawkeye

+2

Aw shucks. Bạn chắc chắn được chào đón. :) – Rayne

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