0

我正在使用 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)))))

请记住,这是打高尔夫球的代码(并不意味着可读)。

简而言之,该函数接受一个字符串,然后将该字符串拆分为一个向量。Reduce 对向量进行迭代,并对向量中的 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)

不知道这里发生了什么。

4

1 回答 1

1

您在 defn args 向量之后使用了额外的括号。它应该是:

(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
于 2013-09-01T22:46:54.527 回答