Clojure PN (java.lang.ClassCastException)
Я использую 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
со значением "+ 3 5"
затем запустите только уменьшение из функции, "(+ 3 5)"
ожидается, как вернулся. Но когда я вызываю функцию как (p "+ 3 5")
Я получаю следующую ошибку.
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
Понятия не имею, что здесь происходит.
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