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