2010-08-04 17 views
12

क्लोजर 1.2RC1 में क्लोजर हल करने का कार्य, मैं स्ट्रिंग के रूप में इसके नाम के आधार पर एक फ़ंक्शन प्राप्त करना चाहता हूं और इसका मूल्यांकन करना चाहता हूं।स्ट्रिंग नाम

समारोह परिभाषा

(ns my-ns) 

(defn mycar [x] (first x)) 

निम्नलिखित काम किया:

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

लेकिन वे बदसूरत लगते हैं। क्या कोई बेहतर तरीका है? यदि नहीं, तो उपरोक्त में से कौन सा बेवकूफ है?

उत्तर

13

यह eval का उपयोग किए बिना मेरे लिए काम किया:

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

इसका कारण यह है निराकरण वर्तमान नाम स्थान में mycar वर पाता है और वर समारोह में यह करने के लिए बाध्य कर रहा है कहता है काम करता है। यह आपके पहले उदाहरण का एक छोटा संस्करण है। मैं इसे सिर्फ इसलिए उपयोग करूंगा ताकि मैं eval का उपयोग करने से बच सकूं।

+1

मैं दूसरा 'हल' या 'ns-resol' का उपयोग करता हूं। 'Intern' का उपयोग करते समय भी ध्यानपूर्वक ध्यान दें। इसका उपयोग करके चीजों को पकड़ना काफी है। – kotarak

+0

इंटर्न के कारण "clobbering" पर अधिक जानकारी के लिए कोई संकेतक? – chris

+0

वार के साथ एक वर सेट करें और वारा पर आपका मूल मेटा डेटा चला जाएगा। अनदेखा करें। तय किया जाना प्रतीत होता है। कम से कम मैं इसे पुन: उत्पन्न नहीं कर सकता। – kotarak

संबंधित मुद्दे