2011-06-22 9 views
5

मैं का उपयोग कर मनमाने ढंग से Clojure स्रोत लोड कर सकते हैं:वर्तमान नामस्थान (कोर नहीं) को लोड-स्ट्रिंग कैसे करें?

(load-string source)

हालांकि, अगर नाम स्थान प्रदान नहीं किया गया है, यह कोड clojure.core नाम स्थान को लोड करता है।

उदाहरण के लिए, कोड निम्नलिखित:

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

एक समारोह को परिभाषित करता है:

#'clojure.core/add

अब, वहाँ कुछ अन्य नाम स्थान के लिए कि कोड को लोड करने के लिए एक रास्ता अधिमानतः एक ही है, जिसमें load-string फ़ंक्शन कहा जाता है?

(। मूल्यांकन से पहले source स्ट्रिंग के लिए एक नाम स्थान घोषणा prepending के अलावा मुझे पता है कि यह समस्या का समाधान होगा - मैं जानना चाहते हैं कि वहाँ एक पसंदीदा तरीका है)

उत्तर

11

जब def जरूरतों तय करने के लिए क्या namspace एक इसमें नया फ़ंक्शन जाना चाहिए ns var के वर्तमान मान को देखता है और उस नामस्थान में नया फ़ंक्शन जोड़ता है। क्योंकि ns एक var है जिसे आप लोड-स्ट्रिंग

user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)")) 
#'foo/f 
user> (foo/f) 
4 
पर कॉल करने से पहले गतिशील रूप से बाध्य कर सकते हैं
संबंधित मुद्दे