Clojure PN(java.lang.ClassCastException)

时间:2013-09-01 21:51:39

标签: clojure rpn

我正在使用Clojure进行代码高尔夫挑战,其目的是编写一个函数来评估并返回波兰表示法表达式中的值。以下是我的代码。

(require '[clojure.string :as s])
(defn p[e](
    (load-string (reduce (fn[x c] 
        (s/replace x #"([\+\-\*\/] (\(.*\) \d+|\d+ \d+))" "($0)")
    ) e (subvec (s/split e #"\d") 1)))))

请记住,这是高尔夫代码(不是可读的)。

简而言之,该函数接受一个字符串,然后将该字符串拆分为一个向量。减少对向量的迭代并对向量中的n-1个元素应用表达式。出现的是Clojure应该能够使用load-string评估的字符串。

如果我声明一个名为e的var,其值为"+ 3 5",那么只运行函数中的reduce,预计返回"(+ 3 5)"。但是当我将函数调用为(p "+ 3 5")时,我收到以下错误。

java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)

不知道这里发生了什么。

1 个答案:

答案 0 :(得分:1)

你在defn args vector之后使用了额外的括号。它应该是:

(defn r[e]
  (load-string 
    (reduce 
      (fn[x c] 
        (s/replace x #"([\+\-\*\/] (\(.*\) \d+|\d+ \d+))" "($0)")) 
      e 
      (subvec (s/split e #"\d") 1))))

user=> (r "+ 3 5")
8