2011-09-30 54 views
7

我有一個數據庫,它在雙引號內返回vaild CL表達式。評估包含爲字符串的表達式

是否可以將這些字符串轉換爲表達式。

例如,我做的這個數據庫查詢通過CLSQL,因此它返回我:

"(foo a b)"

我如何把這個表達式轉換爲:

(foo a b)

並進一步評估它?

回答

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

9是通過read-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是不是一個好主意。

通常你想確保代碼只調用允許的函數。

相關問題