Clojure 什么类型的函数?

Clojure 什么类型的函数?,clojure,types,Clojure,Types,让我们尝试调用“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 现在有一个匿名函数: user=> (type 10) java

让我们尝试调用“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
现在有一个匿名函数:

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\u 8”? B)什么类型的函数

“类型”的来源是:

因此,函数需要有元数据的特定部分,或者是一个类

检查匿名函数的元将生成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}
这些是什么:“用户$eval31$fn____32”和“用户$woot”以及它们来自哪里

检查“类”函数会产生:

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\u 39吗? E)这是一个符号:呜呜


F)为什么函数没有类型?这不应该是IFn之类的吗?

我是个clojure新手,但我要大胆一点。首先,我们对函数的“类型”有两种不同的含义,一种是clojure内部的java接口和类,另一种是作为编程概念的函数类型。采用第二种方法,函数的类型将是其返回值的类型(或其参数类型和返回值类型):

1) 我猜所有函数都实现了接口,不管它们的当前类是什么

2) 如果函数是匿名或命名的,clojure会自动生成类名,但在这两种情况下似乎都是内部类(特别是它们的名称用$分隔,并从外部类转到内部类)

3) 如果在函数定义中对返回值进行注释,则返回值的类型可以在函数元数据的:tag键中。F.e.您公开的函数类的返回类型为class,因为在其def中,名称前有一个^class


我假设您熟悉java(或类似的oop语言),很抱歉,如果您不熟悉,那么函数的类型是
clojure.lang.IFn
,这是一个java接口


每个Clojure函数都编译成一个Java类,该类实现
Clojure.lang.IFn
。名称
user$eval7$fn\u8
是该类的“二进制类名”,即JVM中的内部名称。

以下是

您看到的(“user$eval7$fn__8”)是Clojure为实现您定义的匿名函数而创建的内部生成的内部类的名称

您可能已经注意到,Clojure不遵循标准Java类命名约定:-)


请注意,该类实现了接口clojure.lang.IFn-这适用于所有clojure函数。

clojure是在JVM上构建的

JVM不支持开箱即用的一流函数或lambda。从JVM的角度来看,每个Clojure函数在编译后都会成为自己的匿名类。从技术上讲,每个函数都是自己的类型


它成为的类实现了IFn,但当您检索它的类型时,它会给您匿名类的名称,而匿名类的名称每次都不同。

显然,每个函数都定义了自己的类型(至少对于闭包来说,这有点道理)。您看到的是该函数的自动定义类型。如果没有Clojure fu,我就把它作为一个注释。为什么函数的类型不是:Clojure.lang.IFn?因为当类a实现类b时,它的类型仍然是a而不是b。我是java开发人员,所以我们可以:)我的问题是:为什么你会假设“函数的类型是其返回值的类型”?(我的意思是clojure中的函数是一级对象,因此它们有自己的灵魂:P)jum因为“函数类型”的两种可能意义之间的区别。我很清楚,现在您将函数的类型作为clojure/jvm内部的java对象类型来讨论,而不是函数的签名类型。抱歉搞混了
Returns the :type metadata of x, or its Class if none