Как передать статический метод для comp в clojure? - PullRequest
23 голосов
/ 05 февраля 2010

Похоже, у меня проблемы с доступом к 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, когда он должен искать метод.Как я могу использовать Integer.parseInt, как это?И есть ли лучший способ преобразовать вектор символов в int?

Ответы [ 2 ]

27 голосов
/ 05 февраля 2010

Функции Clojure являются методами java, но методы java не являются функциями clojure Например, функции Clojure имеют метаданные и тому подобное. Если вы хотите использовать java-метод, для которого вызывается функция Clojure, то у вас есть два варианта его оборачивания: memfn и fun or #( ) memfn - это устаревшая функция, которая оборачивает java-метод в функцию clojure (это хорошо знать, что он существует, даже если его часто не используют). Общепринятый способ обернуть Java-методы:

#(. instance method arg1 argN)  

или для статических методов

#(Class/MethodName arg1 argN)
7 голосов
/ 05 февраля 2010
(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 %)))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...