#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
произвольного ввода из базы данных не является хорошей идеей.
Обычно вы хотите убедиться, что код вызывает только разрешенные функции.