Подтвердить что ты не робот

Как передать статический метод для 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?

4b9b3361

Ответ 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 %)))

Зависит от того, хотите ли вы обрабатывать вещи, отличные от целых.