vamos a tratar algunas llamadas a la función de "tipo":¿Qué tipo es una función?
user=> (type 10)
java.lang.Integer
user=> (type 10.0)
java.lang.Double
user=> (type :keyword?)
clojure.lang.Keyword
y ahora con una función anónima:
user=> (type #(str "wonder" "what" "this" "is"))
user$eval7$fn__8
A) ¿qué significa esto "usuario $ eval7 $ fn__8"? B) y de qué tipo es una función?
la fuente de "tipo" es:
user=> (source type)
(defn type
"Returns the :type metadata of x, or its Class if none"
{:added "1.0"}
[x]
(or (:type (meta x)) (class x)))
nil
por lo que una función tiene que tener una parte específica de los metadatos o ser una clase
comprobar la meta de un rendimiento de función nada anónimo:
user=> (meta #(str "wonder" "what" "this" "is"))
nil
intentar un enfoque diferente:
user=> (defn woot [] (str "wonder" "what" "this" "is"))
#'user/woot
user=> (meta woot)
{:ns #<Namespace user>, :name woot}
C) parece que hay algún meta, pero me figuré que este es el meta del símbolo "woot", ¿verdad?
¿qué pasa con la segunda mitad de la "o":
user=> (class #(str "wonder" "what" "this" "is"))
user$eval31$fn__32
user=> (class woot)
user$woot
lo que son estas: "usuario $ eval31 $ fn__32" y "usuario $ woot" y de dónde vienen?
la salida a la "clase" rendimientos de función:
user=> (source class)
(defn ^Class class
"Returns the Class of x"
{:added "1.0"}
[^Object x] (if (nil? x) x (. x (getClass))))
nil
y aún más los rendimientos que investigan:
user=> (.getClass #(str "wonder" "what" "this" "is"))
user$eval38$fn__39
user=> (.getClass woot)
user$woot
i no lo consiguen. D) ¿es este un código hash: eval38 $ fn__39? E) ¿es este un símbolo: woot?
F) ¿Por qué una función no tiene un tipo? ¿No se supone que es un IFn o algo así?
Claramente, cada función define su propio tipo (esto es algo plausible al menos para los cierres). Lo que está viendo allí es el tipo definido automáticamente para esa función. Al carecer de Clojure fu, dejaré esto como un comentario. –