clojure中具有相同名称的多个函数

clojure中具有相同名称的多个函数,clojure,Clojure,嗨, 我是新来clojure的。如上所述,我编写了两个同名函数。 clojure中的多个函数可以有相同的名称吗。如果是,它在同一名称空间中是否冲突?同一名称空间中不能有多个同名函数。如果定义函数foo,然后重新定义,则较新版本将替换较旧版本 不太清楚您想要实现什么,但是Clojure有很多方法可以在一个名称下实现多个实现 人工智能调度 您可以在arity上分派函数: (defn hi[](+ 5 6)) (hi) (defn hi[](+ 6 7)) (hi) 同一函数的不同算术

嗨, 我是新来clojure的。如上所述,我编写了两个同名函数。
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))
我写了两个同名函数

是和否:

  • 您使用相同的名称编写了两个函数定义
  • 第二个定义改写了第一个定义
  • 这些函数从未共享过名称
clojure中的多个函数可以有相同的名称吗

不在同一命名空间中。符号的第二个
def
defn
将擦除第一个

  • 命名空间中只有一个具有给定名称的符号
  • 一个符号一次仅指一个
    var
  • 将符号绑定到它所指的
    var
  • 创建一个函数
  • defn
    宏是
    def
    fn
    表单的包装, 使命名符号引用保存函数的
    var
  • 不同名称空间中具有相同名称的符号不冲突: 它们是不同的符号
如果是,它是否在同一名称空间内冲突

但是

一个函数可以有多个算术-参数计数。这适用于符号通过变量和其他上下文引用的函数



函数定义是计算
defn
的副作用。关于lisps如何计算函数定义,我所知道的最好的解释是第2章

你期望什么?你想实现什么?我只是在检查用同一个名字写多个函数是否正确。如果我有执行不同操作且具有相同函数名的函数,该怎么办?如果函数不同,它们应该具有不同的名称。第二个
defn
覆盖第一个。此外,您可能对此感兴趣。
(defmulti foo class)