Common lisp 计算作为字符串包含的表达式
我有一个数据库,它返回双引号内的有效CL表达式 是否可以将这些字符串转换为表达式 例如,我通过CLSQL从该数据库进行查询,结果它返回我:Common lisp 计算作为字符串包含的表达式,common-lisp,Common Lisp,我有一个数据库,它返回双引号内的有效CL表达式 是否可以将这些字符串转换为表达式 例如,我通过CLSQL从该数据库进行查询,结果它返回我: “(foo a b)” 如何将此表达式转换为: (fooab) 并进一步评估 > (read-from-string "(foo a b)") (FOO A B) ; 9 9是从字符串读取的产生的多个值中的第二个;您可以忽略它: (eval (read-from-string "(foo a b)")) 在给出正确定义的情况下,将执行您想要的操作
“(foo a b)”
如何将此表达式转换为:
(fooab)
并进一步评估
> (read-from-string "(foo a b)")
(FOO A B) ;
9
9
是从字符串读取的产生的多个值中的第二个;您可以忽略它:
(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
不是一个好主意
通常,您希望确保代码只调用允许的函数。谢谢,我怎么能找不到该函数?