2011-09-30 12 views
7

Ho un database che restituisce espressioni CL vaild tra virgolette.Valutazione di espressioni contenute come stringhe

È possibile convertire queste stringhe in espressioni.

Per esempio, faccio una query da questo DB tramite CLSQL e di conseguenza mi restituisce:

"(foo a b)"

Come devo convertire questa espressione per:

(foo a b)

e ulteriormente valutarlo?

risposta

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

Il 9 è il secondo dei valori multipli prodotti da read-from-string; puoi ignorarlo:

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

farà quello che vuoi dato le definizioni appropriate.

+0

Grazie, come posso non trovare quella funzione? – oakenshield1

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

(+ 1 2) 
7 

C'è un problema di sicurezza. Vedi la variabile *read-eval*.

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

3 
9 

Hai davvero bisogno di fare in modo che sia *read-eval*NIL, in modo che la lettura non valuterà il codice.

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

Inoltre chiamando EVAL su input arbitrari da un database non è una buona idea.

In genere si desidera assicurarsi che il codice richiami solo le funzioni consentite.

Problemi correlati