Я использую 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)
Понятия не имею, что здесь происходит.
(defn rpn [& e](reduce #(if (fn? %2)(let [[l r & m]%](cons (%2 r l) m))(cons %2 %))[]e)) @learnclojure
- person A. Webb   schedule 02.09.2013