2010-06-17 36 views
5

我有以下的一个名称空间中说shapes定义Clojure的多方法

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

现在执行的shapes命名空间中的以下内容:

(isa? ::square ::shape) 

回报true。但是,当我执行命名空间中,我真正实现多方法绘制以下,

(isa? ::square ::shape) 

返回false。因此,即使我拥有正确的multimethod调度功能,我也会收到一个错误,指出“找不到调度功能”。

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

回答

3

结果::使用当前命名空间,以便使用来自其他命名空间的类型,您需要使用完全限定的名称,如:shapes/square。

0

在您的自我回答中,您正确地发现::操作符在当前命名空间中查找某些内容。

一个有趣的问题是,关键字可以在您喜欢的任何名称空间中命名空间,即使是没有在任何文件中声明的名称空间。所以如果你的命名空间树很复杂,你更喜欢:geometry/square,:geometry/circle等等,你可以使用它。

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

0

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

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

现在:::short/abc将把相同的:some.terr.ibly.long.package.name/abc

+0

不应该这个是':短/ abc'? – amalloy 2011-03-05 05:29:31

+0

不,但我必须再输入12个字符。 – kotarak 2011-03-11 10:49:02