2012-05-01 25 views
5

Bir dizeyi okumak ve dizenin içindeki içeriği değerlendirmek için eval işlevinin nasıl elde edildiğini anlamaya çalışıyorum.Raket içindeki dizeleri değerlendirme

Şu anda

> (eval '(+ 1 2)) 
    3 

ama raket kullanımı ile bilgili değilim biliyorum. Onu almaya çalışıyorum şu anda yüzden bunu böylece: yararlı kaynakların

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

herhangi bir tavsiye veya bağlantılar mutluluk duyacağız.

+1

Bunun istediğini düşünüyorum: http://stackoverflow.com/q/318952/535275 –

+3

Ayrıca en deyimsel Raket kodu eval kullanımını önler. Belki de gerçekten ihtiyacınız olan bir örneğiniz var, ancak [bu makaleyi] okumak isteyebilirsiniz (http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages-generally. html) Racket'te değerlendirmenin kullanımı hakkında. –

cevap

13

read, open-input-string ile birlikte kullanmak istiyorsunuz. böylece gibi:

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

da kullanabilirsiniz with-input-from-string:

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

Kullanmayı tercih ediyorum (eval (input-with-input-string "(+ 1 2)" read)) '. Niye ya? 1. String portu "eval" ("open-input-string" çözümünün aksine otomatik olarak kapatılır; tamam, yani string portları için, muhtemelen çok fazla önemli değildir (Guile ;-) kullanmıyorsanız) , ama hala); 2. Akışkanlar/parametreler kullanmaz ('in-input-from-string' çözümünden farklı olarak). –