Какой тип является функцией?

давайте попробуем несколько вызовов функции "type":

user=> (type 10)
java.lang.Integer

user=> (type 10.0)
java.lang.Double

user=> (type :keyword?)
clojure.lang.Keyword

и теперь с анонимной функцией:

user=> (type #(str "wonder" "what" "this" "is"))
user$eval7$fn__8

A) что это означает " пользователь $ eval7 $ fn__8 "? B) и какой тип является функцией?

источник для «типа»:

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

поэтому функция должна иметь определенную часть метаданных или быть классом

, проверяющим соответствие meta анонимной функции дает nada:

user=> (meta #(str "wonder" "what" "this" "is"))
nil

пробует другой подход:

user=> (defn woot [] (str "wonder" "what" "this" "is"))
#'user/woot
user=> (meta woot)
{:ns #<Namespace user>, :name woot}

C) кажется, есть некоторая мета, но я решил, что это мета символа «woot», верно?

как насчет вторая половина «or»:

user=> (class #(str "wonder" "what" "this" "is"))
user$eval31$fn__32

user=> (class woot)
user$woot

что это: «user $ eval31 $ fn__32» и «user $ woot» и откуда они берутся?

проверка функции «class» дает:

user=> (source class)
(defn ^Class class
  "Returns the Class of x"
  {:added "1.0"}
  [^Object x] (if (nil? x) x (. x (getClass))))
nil

] и дальнейшее исследование дает:

user=> (.getClass #(str "wonder" "what" "this" "is"))
user$eval38$fn__39

user=> (.getClass woot)
user$woot

я не понимаю. D) это хэш-код: eval38 $ fn__39? E) это символ: woot?

F) почему функция не имеет типа? Разве это не должно быть IFn или что-то в этом роде?

18
задан Belun 14 September 2010 в 11:43
поделиться