2011-09-30 32 views
7

के रूप में निहित अभिव्यक्तियों का मूल्यांकन करना मेरे पास एक डेटाबेस है जो डबल कोट्स के भीतर vaild CL अभिव्यक्ति देता है।स्ट्रिंग्स

क्या इन तारों को अभिव्यक्तियों में परिवर्तित करना संभव है।

उदाहरण के लिए, मैं CLSQL के माध्यम से इस डीबी से एक प्रश्न बनाने के लिए और एक परिणाम के रूप में यह मुझे देता है:

"(foo a b)"

मैं कैसे करने के लिए इस अभिव्यक्ति को परिवर्तित करना चाहिए:

(foo a b)

और इसका मूल्यांकन करें?

उत्तर

11
> (read-from-string "(foo a b)") 
(FOO A B) ; 
9 

9read-from-string द्वारा उत्पादित एक से अधिक मान की दूसरी है; आप इसे अनदेखा कर सकते हैं:

(eval (read-from-string "(foo a b)")) 

वह करेगा जो आप उचित परिभाषाओं को देना चाहते हैं।

+0

धन्यवाद, मैं यह फ़ंक्शन कैसे नहीं ढूंढ सकता? – oakenshield1

1
* (read-from-string "(+ 1 2)") 

(+ 1 2) 
7 

एक सुरक्षा समस्या है। परिवर्तनीय *read-eval* देखें।

* (read-from-string "#.(+ 1 2)") 

3 
9 

आप वास्तव में लगता है कि *read-eval*NIL है, ताकि पढ़ने कोड का मूल्यांकन नहीं होगा बनाने की जरूरत है।

* (let ((*read-eval* nil)) (read-from-string "#.(+ 1 2)")) 

debugger invoked on a SB-INT:SIMPLE-READER-ERROR: 
    can't read #. while *READ-EVAL* is NIL 

साथ ही एक डेटाबेस से मनमाने ढंग से इनपुट पर बुला EVAL एक अच्छा विचार नहीं है।

आमतौर पर आप यह सुनिश्चित करना चाहते हैं कि कोड केवल कॉल किए गए कार्यों को कॉल करे।

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