Вычисление выражений, содержащихся в виде строк

#common-lisp

#common-lisp

Вопрос:

У меня есть база данных, которая возвращает выражения vaild CL в двойных кавычках.

Возможно ли преобразовать эти строки в выражения.

Например, я делаю запрос из этой базы данных через CLSQL, и в результате он возвращает меня:

"(foo a b)"

Как мне преобразовать это выражение в:

(foo a b)

и далее оценивать его?

Ответ №1:

 > (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 произвольного ввода из базы данных не является хорошей идеей.

Обычно вы хотите убедиться, что код вызывает только разрешенные функции.