我有一個數據庫,它在雙引號內返回vaild CL表達式。評估包含爲字符串的表達式
是否可以將這些字符串轉換爲表達式。
例如,我做的這個數據庫查詢通過CLSQL,因此它返回我:
"(foo a b)"
我如何把這個表達式轉換爲:
(foo a b)
並進一步評估它?
我有一個數據庫,它在雙引號內返回vaild CL表達式。評估包含爲字符串的表達式
是否可以將這些字符串轉換爲表達式。
例如,我做的這個數據庫查詢通過CLSQL,因此它返回我:
"(foo a b)"
我如何把這個表達式轉換爲:
(foo a b)
並進一步評估它?
> (read-from-string "(foo a b)")
(FOO A B) ;
9
的9
是通過read-from-string
產生的多個值的第二;你可以忽略它:
(eval (read-from-string "(foo a b)"))
會做你想要的正確的定義。
* (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
是不是一個好主意。
通常你想確保代碼只調用允許的函數。
謝謝,我怎麼能找不到那個功能? – oakenshield1