什么是+;是否在Clojure(或任何其他Lisp)中使用函数?

什么是+;是否在Clojure(或任何其他Lisp)中使用函数?,clojure,lisp,Clojure,Lisp,我知道Lisp(通常)是动态类型的,但我猜它们的值仍然有类型。函数是lisps中的值,所以我想知道函数的类型是什么 List of number->number似乎最有可能,所以我在Clojure中尝试了(+'(23))和(+[23]),但都不起作用 是否可以在Clojure REPL中查询值(或表达式)的类型?Clojure具有该函数 > (type +) clojure.core$_PLUS_ > (type clojure.core$_PLUS_) java.lang.Cla

我知道Lisp(通常)是动态类型的,但我猜它们的值仍然有类型。函数是lisps中的值,所以我想知道函数的类型是什么

List of number->number
似乎最有可能,所以我在Clojure中尝试了
(+'(23))
(+[23])
,但都不起作用

是否可以在Clojure REPL中查询值(或表达式)的类型?

Clojure具有该函数

> (type +)
clojure.core$_PLUS_

> (type clojure.core$_PLUS_)
java.lang.Class

> (type (+ 1 1))
java.lang.Long

> (type (+ 1.0 1.0))
java.lang.Double
因此,
+
函数根据参数返回
Long
Double

其他算术函数也会根据参数返回不同的类型:

> (type (/ 3 1))
java.lang.Long

> (type (/ 3.0 1))
java.lang.Double

> (type (/ 1 3))
clojure.lang.Ratio

如果您想了解该函数是如何实现的,那么它非常简单。这可以让您了解如何定义多算术函数。

它实际上是一种非常复杂的类型,很难正式定义,原因有很多:

  • 它是一个多算术函数(接受数量可变的参数)。请注意,这不同于采用单个参数(数字列表)的函数。如果要在数字列表上使用
    +
    ,则需要使用
    应用
    ,例如
    (应用+[1 2 3 4])
  • 每个参数可以是任何类型的编号。有许多可能的数字类型,实际上任何扩展基类的东西都足够了
  • 定义了内联版本,可以直接生成原语类型

没有一种简单的方法可以从REPL中确定这一点。但您可能会感兴趣的是,哪一个提供了类型系统以及在Clojure中定义类型和执行相应类型检查的方法。它使用了一种称为“渐进式类型化”的简洁方法,因此您可以在需要的地方添加类型注释:您不需要立即将类型分配给整个程序。

“任何扩展java.lang.Number基类的东西都足够了。”真的吗
Number
不定义任何算术方法,它是如何工作的?Number定义了一个
doubleValue
方法,您可以调用该方法将其转换为double,然后执行double算术。我相信这就是Clojure所做的,如果提供了一个未知数字的子类,而这个子类不是以其他方式处理的!两条注释:(1)
+
将根据需要返回除Long和Double以外的类型,例如,对于不适合Long的数字文本,它将返回
clojure.lang.BigInt
。(2) 对编译后的函数类调用
type
,并不是很有启发性。尝试使用
祖先
,例如
(祖先clojure.core$\u PLUS)