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

Paw*_*mar 1 clojure

(defn hi[](+ 5 6))  
(hi)  
(defn hi[](+ 6 7))  
(hi) 
Run Code Online (Sandbox Code Playgroud)

嗨,我是clojure的新手.如上所述,我写了两个同名的函数.我们可以在clojure中为多个函数使用相同的名称.如果是,它是否在相同的名称空间内冲突?

Mar*_*ark 7

在同一名称空间中不能有多个具有相同名称的函数.如果您定义函数foo然后再次重新定义它,则较新的版本将替换旧版本.

目前还不是很清楚你想要实现什么,但Clojure有很多方法可以在一个名称下实现多个实现.

Arity Dispatch

您可以在arity上调度函数:

(defn foo
  ([x] :version-one)
  ([x y] :version-two)
  ([x y & more] :version-tree))
Run Code Online (Sandbox Code Playgroud)

同一函数的不同arities可以相互调用,这有点等同于具有多个具有相同名称的函数.

多方法

您可以使用multimethods进行调度.它们允许您定义将在参数上调用的函数,其结果将用于调度.

(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))
Run Code Online (Sandbox Code Playgroud)

协议

这种技术类似于其他语言的多态性.您可以调度参数类型.这是一个例子:

(defprotocol foo
  (my-fnc [x] "description..."))

(extend-protocol foo
  Number
  (my-fnc [x] :number-version)
  String
  (my-fnc [x] :string-version))
Run Code Online (Sandbox Code Playgroud)

多方法是最强大的工具,你可以用这种方式模拟协议:

(defmulti foo class)
Run Code Online (Sandbox Code Playgroud)