11

I've a database which returns vaild CL expressions within double quotes.

Is it possible to convert these strings to expressions.

For example, I make a query from this DB via CLSQL and as a result it returns me:

"(foo a b)"

How should I convert this expression to:

(foo a b)

and further evaluate it?

2 Answers 2

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

The 9 is the second of multiple values produced by read-from-string; you can ignore it:

(eval (read-from-string "(foo a b)"))

will do what you want given the proper definitions.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, how can i could not find that function?
4
* (read-from-string "(+ 1 2)")

(+ 1 2)
7

There is a security problem. See the variable *read-eval*.

* (read-from-string "#.(+ 1 2)")

3
9

You really need to make sure that *read-eval* is NIL, so that reading will not evaluate code.

* (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

Additionally calling EVAL on arbitrary input from a database is not a good idea.

Usually you want to make sure that the code does only call allowed functions.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.