定义Clojure多方法

时间:2010-06-17 16:05:03

标签: clojure multimethod

我在一个名称空间中有以下内容:shapes

(derive ::rect ::shape)
(derive ::square ::rect)

现在在shapes命名空间中执行以下操作:

(isa? ::square ::shape)

返回true。但是当我在命名空间中执行以下操作时,实际上我实现了绘制多方法,

(isa? ::square ::shape)

它返回false。因此,即使我有正确的多方法调度函数,我也会收到一条错误消息“未找到调度函数”。

我错过了什么吗?在一个巨大的命名空间中实现所有类型的形状对我来说似乎毫无意义。

3 个答案:

答案 0 :(得分:3)

结果,::使用当前命名空间,因此为了使用其他命名空间中的类型,您需要使用完全限定的名称,例如:shapes / square。

答案 1 :(得分:0)

在你的自我答案中,你是正确的,::运算符在当前命名空间中找到一些东西。

一个有趣的观点是,关键字可以在您喜欢的任何命名空间中命名,甚至可以在任何文件中声明。因此,如果您的命名空间树很复杂,并且您更喜欢:geometry / square,:geometry / circle等,则可以使用它。

另外,不要忘记派生,不成功(现在不要使用underive),isa?和相关的功能都可以让你使用独立的层次结构。见When and how should independent hierarchies be used in clojure?

答案 2 :(得分:0)

您也可以将::与名称空间别名一起使用。

(ns some.other.package
  (:require [some.terr.ibly.long.package.name :as short]))

现在:::short/abc将与:some.terr.ibly.long.package.name/abc

相同