我有一个数据库,它在双引号内返回vaild CL表达式。
是否可以将这些字符串转换为表达式。
例如,我通过CLSQL从这个数据库中进行查询,结果它返回了我:
"(foo a b)"
我应该如何将此表达式转换为:
(foo a b)
并进一步评估它?
答案 0 :(得分:12)
> (read-from-string "(foo a b)")
(FOO A B) ;
9
9
是read-from-string
生成的多个值中的第二个;你可以忽略它:
(eval (read-from-string "(foo a b)"))
将根据正确的定义做你想做的事。
答案 1 :(得分:2)
* (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
不是一个好主意。
通常你想确保代码只调用允许的函数。