我有一个数据库,它在双引号内返回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