2016-02-27 147 views
0

数学字符串我需要实现一个名为EVAL-数学串Clojure中的函数,该函数数学字符串作为输入,并对其进行评估: (eval-math-string "7+8/2") => 11评估Clojure中

所以,我已经成功地掰开一个表达式使用re-seq,现在我想用Incanter对它进行评估。然而,我有一个表达式(“7”“+”“8”“/”“2”),但Incanter需要像($ = 7 + 8/2)这样的表达式,其中$ =是incanter关键字。如何将单字符串列表提供给包含$ =的列表,以便它正确执行。如果参数是字符串,该函数将不起作用,但我无法将+,*,/等转换为数字,所以我有点卡住了。

有谁知道我该怎么做,或者如果有更好的方法来做到这一点?

+0

什么问题用'(str“($ =”math-string“)”)'其中'math-string'是你的输入吗? – jmargolisvt

+0

你是否需要使用Incanter? –

+0

@Piotrek Bzdyl:不,根本不是,如果你知道更好的方法。 – Phylth

回答

3

奸人的$=just calls the infix-to-prefix function,所以你需要做的就是将你的字符串列表转换为符号和数字列表,然后拨打infix-to-prefix

我要去假设输入只是串的平面列表,其中的每一个表示一个整数(例如"7""8""2")或符号(例如"+""/")。如果这种假设是正确的,你可以写这样的转换功能:

(defn convert [s] 
    (try 
    (Long/parseLong s) 
    (catch NumberFormatException _ 
     (symbol s)))) 

例子:

(infix-to-prefix (map convert ["7" "+" "8" "/" "2"])) 

当然,如果你只是写上$=顶部宏,有没有必要请致电infix-to-prefix,因为您只是将$=列为第一项。我会假设你已经有一个名为math-split功能,可以改变像"7+8/2"成类似["7" "+" "8" "/" "2"],在这种情况下,你可以这样做:

(defmacro eval-math-string [s] 
    `($= [email protected](map convert (math-split s)))) 

例子:

(macroexpand-1 '(eval-math-string "7+8/2")) 
;=> (incanter.core/$= 7 + 8/2)