2011-06-22 32 views
5

tôi có thể tải nguồn Clojure tùy ý sử dụng:Làm thế nào để tải chuỗi thành không gian tên hiện tại (không phải lõi)?

(load-string source)

Tuy nhiên, nếu không gian tên không được cung cấp, nó tải mã để clojure.core namespace.

Ví dụ, đoạn mã sau:

(load-string "(defn add [a b] (+ a b))")

định nghĩa một hàm:

#'clojure.core/add

Bây giờ, là có một cách để tải mã mà một số không gian tên khác, tốt nhất là cùng một trong đó chức năng load-string được gọi là gì?

(. Ngoài prepending một tuyên bố namespace để source chuỗi trước khi đánh giá tôi biết rằng nó sẽ giải quyết vấn đề - Tôi muốn biết là có một cách ưa thích)

Trả lời

11

khi def cần phải quyết định những gì namspace một chức năng mới nên đi vào trong nó nhìn vào giá trị hiện tại của ns var và thêm hàm mới vào không gian tên đó. bởi vì ns là một var, bạn có thể liên kết động nó trước khi gọi chuỗi tải

user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)")) 
#'foo/f 
user> (foo/f) 
4 
Các vấn đề liên quan