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
Другие вопросы по тегам