Как передать статический метод для comp в clojure?
Кажется, что у меня возникают проблемы с доступом к Integer.parseInt
в comp. Я могу получить доступ к нему обычно следующим образом:
user=> (Integer/parseInt "123")
123
Но если я поместил его в comp, я получаю сообщение об ошибке:
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, когда он должен искать метод. Как я могу использовать Integer.parseInt
как это? И есть ли лучший способ преобразовать вектор символов в int
?
Ответы
Ответ 1
Clojure функции являются java-методами, но java-методы не являются clojure функциями Например, функции clojure имеют метаданные и т.д. Если вы хотите использовать java-метод, в котором вызывается функция clojure, тогда у вас есть два варианта их обертывания, memfn
и fun or #( )
memfn - это устаревшая функция, которая завершает Java-метод в clojure функция (ее полезно знать, что она существует, даже если она не используется часто). Общепринятым способом обертывания java-методов является:
#(. instance method arg1 argN)
или для статических методов
#(Class/MethodName arg1 argN)
Ответ 2
(def vec-to-int (comp #(Integer/parseInt %) (partial apply str)))
или
(def vec-to-int #(Integer/parseInt (apply str %)))
partial
и comp
обычно не так лаконичны в Clojure как использование #()
для создания анонимного fn. Лично я бы написал его так:
(defn vec-to-int [x] (Integer/parseInt (apply str x)))
Вы можете сделать это с помощью простого def
, но что вы на самом деле используете def
вместо defn
? Использование def
скрывает тот факт, что вы определяете функцию. defn
также устанавливает дополнительные метаданные для вас (арбитры), которые def
не поддерживает.
В любом случае, это более общий способ делать то, что вы делаете:
(def vec-to-int #(bigint (apply str %)))
И еще более общий:
(def vec-to-int #(read-string (apply str %)))
Зависит от того, хотите ли вы обрабатывать вещи, отличные от целых.