2012-05-01 78 views
5

我想了解如何讓eval函數讀取字符串並評估字符串內部的內容。如何評價球拍中的字符串

目前我知道

> (eval '(+ 1 2)) 
    3 

,但我不使用球拍的那個知識淵博。所以此刻我想要得到它,這樣我可以做到這一點:

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

任何意見或鏈接到有用的資源將不勝感激。

+1

我想這是你想要什麼:http://stackoverflow.com/q/318952/535275 –

+3

此外,最地道的球拍代碼避免使用eval。也許你有一個你真正需要它的例子,但是你可能想閱讀[這篇文章](http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages-generally。 html)關於在Racket中使用eval的問題。 –

回答

13

您想要將readopen-input-string一起使用。像這樣:

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

您還可以使用with-input-from-string

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

我更喜歡使用'(eval(call-with-input-string「(+ 1 2)」read))'。爲什麼? 1.字符串端口在'eval'之前自動關閉(與'open-input-string'解決方案不同;對於字符串端口,它可能並不重要(除非你使用Guile ;-)) ,但仍然); 2.它不使用流體/參數(不像'帶有輸入的字符串'解決方案)。 –