2012-05-01 18 views
5

Próbuję zrozumieć, jak uzyskać funkcję eval przeczytać ciąg i oceniać zawartość, która jest w środku łańcucha.Jak eval ciągi w rakietę

Obecnie wiem, że

> (eval '(+ 1 2)) 
    3 

ale nie jestem kompetentny przy użyciu rakiety. Więc w tej chwili staram się dostać to tak, że mogę to zrobić:

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

Wszelkie porady lub linki do przydatnych zasobów będą mile widziane.

+1

myślę, że to, co chcesz: http://stackoverflow.com/q/318952/535275 –

+3

Również najbardziej idiomatyczne kod Racket unika stosowania eval. Może masz przykład, w którym naprawdę tego potrzebujesz, ale możesz przeczytać [ten artykuł] (http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages- generalnie. html) o używaniu eval w Racket. –

Odpowiedz

13

Chcesz użyć read wraz z open-input-string. Tak:

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

Można również użyć with-input-from-string:

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

Wolę używać '(eval (call-in-input-string" (+ 1 2) "read))'. Czemu? 1. String port jest automatycznie zamykany przed 'eval' (w przeciwieństwie do' open-input-string', w porządku, więc dla portów string, prawdopodobnie nie ma to znaczenia (chyba że używasz Guile ;-)) , ale nadal); 2. Nie używa płynów/parametrów (w przeciwieństwie do rozwiązania 'with-input-from-string'). –