clojure中具有相同名称的多个函数
嗨, 我是新来clojure的。如上所述,我编写了两个同名函数。clojure中具有相同名称的多个函数,clojure,Clojure,嗨, 我是新来clojure的。如上所述,我编写了两个同名函数。 clojure中的多个函数可以有相同的名称吗。如果是,它在同一名称空间中是否冲突?同一名称空间中不能有多个同名函数。如果定义函数foo,然后重新定义,则较新版本将替换较旧版本 不太清楚您想要实现什么,但是Clojure有很多方法可以在一个名称下实现多个实现 人工智能调度 您可以在arity上分派函数: (defn hi[](+ 5 6)) (hi) (defn hi[](+ 6 7)) (hi) 同一函数的不同算术
clojure中的多个函数可以有相同的名称吗。如果是,它在同一名称空间中是否冲突?同一名称空间中不能有多个同名函数。如果定义函数
foo
,然后重新定义,则较新版本将替换较旧版本
不太清楚您想要实现什么,但是Clojure有很多方法可以在一个名称下实现多个实现
人工智能调度
您可以在arity上分派函数:
(defn hi[](+ 5 6))
(hi)
(defn hi[](+ 6 7))
(hi)
同一函数的不同算术可以互相调用,这在某种程度上相当于有几个同名函数
多种方法
您可以使用多种方法进行调度。它们允许您定义一个函数,该函数将在参数上调用,其结果将用于调度
(defn foo
([x] :version-one)
([x y] :version-two)
([x y & more] :version-tree))
协议
这种技术类似于其他语言中的多态性。可以根据参数类型进行分派。下面是一个例子:
(defmulti foo odd?)
(defmethod foo true [x]
(format "look, ma, %d is odd!" x))
(defmethod foo false [x]
(format "look, ma, %d is even!" x))
Multimethods是最强大的工具,您可以通过这种方式模拟协议:
(defprotocol foo
(my-fnc [x] "description..."))
(extend-protocol foo
Number
(my-fnc [x] :number-version)
String
(my-fnc [x] :string-version))
我写了两个同名函数
是和否:
- 您使用相同的名称编写了两个函数定义
- 第二个定义改写了第一个定义
- 这些函数从未共享过名称
def
或defn
将擦除第一个
- 命名空间中只有一个具有给定名称的符号李>
- 一个符号一次仅指一个
var
- 将符号绑定到它所指的
var
- 创建一个函数李>
宏是defn
和def
表单的包装, 使命名符号引用保存函数的fn
var
- 不同名称空间中具有相同名称的符号不冲突: 它们是不同的符号
函数定义是计算
defn
的副作用。关于lisps如何计算函数定义,我所知道的最好的解释是第2章 你期望什么?你想实现什么?我只是在检查用同一个名字写多个函数是否正确。如果我有执行不同操作且具有相同函数名的函数,该怎么办?如果函数不同,它们应该具有不同的名称。第二个defn
覆盖第一个。此外,您可能对此感兴趣。
(defmulti foo class)