2011-11-28 74 views
2

可能重复:
How do you evaluate a string as a clojure expression?Clojure“eval”无法评估!

从一个JTextField /地区(从Java应用程序)获得的数据返回类java.lang.String的数据。将此数据传递给evalClojure未对其进行评估,而是因为它是字符串而打印。如何使评估评估此数据并返回输出。

例如)假设在文本字段的数据是(+ 2 3)

(println (eval (.getText text-field)))

enter image description here这将打印(+ 2 3)代替

+0

是的,这是一个副本。我应该在发布答案之前检查:) – Ankur

+0

@ sepp2k不仅字符串,而且可以由Java应用程序返回的所有类型的数据。但重复也解决了我的问题! – vikbehal

回答

9

您需要将字符串转换为Clojure的数据结构可以eval'd之前,因为eval需要一个有效的表单数据结构按照文档:

(doc eval) 
------------------------- 
clojure.core/eval 
([form]) 
    Evaluates the form data structure (not text!) and returns the result. 

这样做的最简单方法是在字符串上使用read-string,例如,

(eval (read-string "(+ 2 7)")) 
=> 9 
+4

read-string是REPL的'R'部分 –

4

你会必须将字符串"(+ 2 3)"转换为列表数据结构,即(list + 2 3)'(+ 2 3),然后将其传递给eval以评估表单。

(eval (read (new java.io.PushbackReader (new java.io.StringReader "(+ 1 2)")))) 

读的是“读者”,它读取数据流并将其解析为Clojure的代码,然后利用评价:A字符串被计算为一个字符串,因此你evaling字符串"(+ 2 3)"

除权后得到"(+ 2 3)" EVAL

+6

您可以使用'read-string'而不是将'read'用于阅读器对象。 – sepp2k