conj string vector clojure integer

string - conj - ¿Cómo paso un método estático para comp en Clojure?



modulo clojure (2)

Las funciones de Clojure son métodos de Java pero los métodos de Java no son funciones de Clojure. Por ejemplo, las funciones de Clojure tienen metadatos y demás . Si desea utilizar un método java donde se necesita una función Clojure, tiene dos opciones para completarla, memfn y fun or #( ) memfn es una función obsoleta que envolvió un método java en una función clojure (es bueno saber que existe incluso si no se usa con frecuencia). La forma generalmente aceptada de concluir los métodos de Java es:

#(. instance method arg1 argN)

o para métodos estáticos

#(Class/MethodName arg1 argN)

Parece que tengo problemas para acceder a Integer.parseInt en comp. Puedo acceder normalmente de esta manera:

user=> (Integer/parseInt "123") 123

Pero si lo pongo en comp, recibo un error:

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)

Me parece que está intentando encontrar un campo en Integer cuando debería estar buscando un método. ¿Cómo puedo usar Integer.parseInt así? ¿Y hay una mejor manera de convertir un vector de caracteres en un int ?


(def vec-to-int (comp #(Integer/parseInt %) (partial apply str)))

O

(def vec-to-int #(Integer/parseInt (apply str %)))

partial y comp generalmente no son tan concisos en Clojure como el uso de #() para hacer un fn anónimo. Personalmente lo escribiría de esta manera:

(defn vec-to-int [x] (Integer/parseInt (apply str x)))

Puedes hacer esto con una def simple, pero ¿qué ganas usando def lugar de defn , realmente? Usar def oscurece el hecho de que está definiendo una función. defn también configura metadatos adicionales para usted (arglists) que def no.

En cualquier caso, esta es una forma más general de hacer lo que estás haciendo:

(def vec-to-int #(bigint (apply str %)))

Y aún más general:

(def vec-to-int #(read-string (apply str %)))

Depende de si desea ser capaz de manejar cosas que no sean enteros.