我正在使用 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)
不知道这里发生了什么。