2010-08-04 29 views
12

Trong clojure 1.2RC1, tôi muốn lấy hàm dựa trên tên của nó dưới dạng chuỗi và đánh giá nó.chức năng giải quyết clojure từ tên chuỗi

nét Chức năng

(ns my-ns) 

(defn mycar [x] (first x)) 

Sau đây làm việc:

((ns-resolve *ns* (symbol "mycar")) '(3 4)) 
((intern *ns* (symbol "mycar")) '(3 4)) 
((eval (symbol "mycar")) '(3 4)) 

nhưng họ có vẻ xấu xí. Có cách nào tốt hơn? Nếu không, cái nào ở trên là thành ngữ nhất?

Trả lời

13

này làm việc cho tôi mà không sử dụng eval:

user> (defn mycar [x] (first x)) 
#'user/mycar 
user> ((resolve (symbol "mycar")) [1 2 3]) 
1 

này hoạt động vì giải quyết tìm var đối tượng mycar trong không gian tên hiện tại và var gọi hàm đó là ràng buộc để. Đây là phiên bản ngắn hơn của ví dụ đầu tiên của bạn. Tôi muốn sử dụng nó chỉ để tôi có thể tránh sử dụng eval.

+1

Tôi thứ hai sử dụng 'resolve' hoặc' ns-resolve'. Cũng chú ý khi sử dụng 'intern'. Nó là khá clobber những thứ bằng cách sử dụng nó. – kotarak

+0

Bất kỳ con trỏ nào để biết thêm thông tin về "clobbering" do thực tập sinh? – chris

+0

Đặt Var với thực tập và dữ liệu meta gốc của bạn trên Var sẽ biến mất. Bỏ qua. Dường như cố định. Ít nhất tôi không thể tái tạo nó nữa. – kotarak

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