wollen wir versuchen, einige Anrufe auf die "Art" -Funktion:Welcher Typ ist eine Funktion?
user=> (type 10)
java.lang.Integer
user=> (type 10.0)
java.lang.Double
user=> (type :keyword?)
clojure.lang.Keyword
und jetzt mit einer anonymen Funktion:
user=> (type #(str "wonder" "what" "this" "is"))
user$eval7$fn__8
A) was bedeutet das "fn__8 Benutzer $ eval7 $"? B) und welcher Typ ist eine Funktion?
die Quelle für „Typ“ ist:
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
so muss eine Funktion einen bestimmten Teil von Meta-Daten haben oder eine Klasse
Überprüfung der Meta einer anonymen Funktion Ausbeuten nada sein:
user=> (meta #(str "wonder" "what" "this" "is"))
nil
versucht, einen anderen Ansatz:
user=> (defn woot [] (str "wonder" "what" "this" "is"))
#'user/woot
user=> (meta woot)
{:ns #<Namespace user>, :name woot}
C) scheint es gibt einige Meta, aber ich dachte, das ist die Meta des Symbols "woot", richtig?
was ist mit der zweiten Hälfte des "oder":
user=> (class #(str "wonder" "what" "this" "is"))
user$eval31$fn__32
user=> (class woot)
user$woot
was sind diese: "user eval31 $ $ fn__32" und "user $ woot" und wo kommen sie her?
die "Klasse" Funktion Ausbeuten Check-out:
user=> (source class)
(defn ^Class class
"Returns the Class of x"
{:added "1.0"}
[^Object x] (if (nil? x) x (. x (getClass))))
nil
und weitere Untersuchung ergibt:
user=> (.getClass #(str "wonder" "what" "this" "is"))
user$eval38$fn__39
user=> (.getClass woot)
user$woot
ich es nicht. D) ist dies ein Hashcode: eval38 $ fn__39? E) ist dies ein Symbol: woot?
F) Warum hat eine Funktion keinen Typ? sollte es nicht ein IFn oder etwas sein?
Offensichtlich definiert jede Funktion ihren eigenen Typ (dies ist zumindest für Verschlüsse einigermaßen plausibel). Was Sie dort sehen, ist der automatisch definierte Typ für diese Funktion. Ohne Clojure fu, lasse ich das einfach als Kommentar. –