2011-09-30 9 views
7

Tengo una base de datos que devuelve expresiones CL de vaild entre comillas dobles.Evaluar expresiones contenidas como cadenas

Es posible convertir estas cadenas en expresiones.

Por ejemplo, hago una consulta de esta base de datos a través de CLSQL y como resultado me devuelve:

"(foo a b)"

Cómo debería convertir esta expresión para:

(foo a b)

y evaluarlo más?

Respuesta

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

El 9 es el segundo de los valores múltiples producidos por read-from-string; puede ignorarlo:

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

va a hacer lo que quiere dan las definiciones correctas.

+0

Gracias, ¿cómo no pude encontrar esa función? – oakenshield1

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

(+ 1 2) 
7 

Hay un problema de seguridad. Vea la variable *read-eval*.

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

3 
9 

que realmente necesita para asegurarse de que es *read-eval*NIL, por lo que la lectura no evaluará código.

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

Además llamando EVAL en la entrada arbitraria de una base de datos no es una buena idea.

Normalmente desea asegurarse de que el código solo llame a las funciones permitidas.

Cuestiones relacionadas