评估包含在字符串中的表达式

时间:2011-09-30 14:41:10

标签: common-lisp

我有一个数据库,它在双引号内返回vaild CL表达式。

是否可以将这些字符串转换为表达式。

例如,我通过CLSQL从这个数据库中进行查询,结果它返回了我:

"(foo a b)"

我应该如何将此表达式转换为:

(foo a b)

并进一步评估它?

2 个答案:

答案 0 :(得分:12)

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

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

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