2012-05-01 14 views
5

Estoy tratando de entender cómo obtener la función eval para leer una cadena y evaluar el contenido que está dentro de la cadena.Cómo evaluar cadenas en la raqueta

Actualmente sé que

> (eval '(+ 1 2)) 
    3 

pero no estoy informado de que con el uso de la raqueta. Así que en este momento estoy tratando de hacerlo de modo que pueda hacer esto:

> (eval "(+ 1 2)") 
    3 

Cualquier consejo o enlaces a recursos útiles serían apreciadas.

+1

Creo que esto es lo que quiere: http://stackoverflow.com/q/318952/535275 –

+3

Además, el código de la raqueta más idiomática evita el uso de eval. Tal vez tenga un ejemplo donde realmente lo necesita, pero es posible que desee leer [este artículo] (http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages-generally. html) sobre el uso de eval en Racket. –

Respuesta

13

Quiere usar read junto con open-input-string. De este modo:

-> (eval (read (open-input-string "(+ 1 2)"))) 
3 

Puede también utilizar with-input-from-string:

-> (with-input-from-string "(+ 1 2)" 
    (lambda() (eval (read)))) 
3 
+7

Prefiero usar '(eval (call-with-input-string" (+ 1 2) "read))'. ¿Por qué? 1. El puerto de cadena se cierra automáticamente antes del 'eval' (a diferencia de la solución' open-input-string'; está bien, entonces para los puertos de cadena, probablemente no importe demasiado (a menos que esté usando Guile ;-)) , pero aún); 2. No usa fluidos/parámetros (a diferencia de la solución 'with-input-from-string'). –