Кажется, как будто у меня есть проблемы при доступе Integer.parseInt
в аккомпанементе. Я могу обычно получать доступ к нему как это:
user=> (Integer/parseInt "123")
123
Но если я поместил его в аккомпанемент, я получаю ошибку:
user=> (def vect-to-int (comp Integer/parseInt (partial apply str)))
java.lang.Exception: Unable to find static field: parseInt in class java.lang.Integer (NO_SOURCE_FILE:3)
Это звучит мне как, он пытается найти поле на Целом числе, когда это должно искать метод. Как я могу использовать Integer.parseInt
как это? И есть ли лучший способ преобразовать вектор символов в int
?
Клоюрные функции являются java-методами, но java-методы не являются клоюрными функциями Например, клоюрные функции имеют мета-данные и тому подобное. Если вы хотите использовать метод java, для которого вызывается функция Clojure, то у вас есть два варианта его обёртывания, memfn
и fun или #( )
memfn - это устаревшая функция, которая обёртывала метод java в функцию clojure (хорошо знать, что он существует, даже если он не используется часто). Общепринятым способом обёртывания java-методов является:
#(. instance method arg1 argN)
или для статических методов
#(Class/MethodName arg1 argN)
(def vec-to-int (comp #(Integer/parseInt %) (partial apply str)))
Или
(def vec-to-int #(Integer/parseInt (apply str %)))
частичный
и comp
обычно не так лаконичны в Clojure, как использование # ()
, чтобы сделать анонимный fn. Лично я бы написал это так:
(defn vec-to-int [x] (Integer/parseInt (apply str x)))
Вы можете сделать это с помощью простого def
, но что вы получите, используя def
вместо defn
, правда? ? Использование def
скрывает тот факт, что вы определяете функцию. defn
также устанавливает для вас дополнительные метаданные (arglists), которых не делает def
.
В любом случае, это более общий способ делать то, что вы делаете:
(def vec-to-int #(bigint (apply str %)))
И еще более общий:
(def vec-to-int #(read-string (apply str %)))
Зависит от того, хотите ли вы иметь возможность обрабатывать вещи, отличные от целых чисел.