2011-09-30 56 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是不是一个好主意。

通常你想确保代码只调用允许的函数。

相关问题