2014-03-31 45 views
1

我正在执行“Practical Clojure”一书中的代码,并且有些内容我不了解层次结构。也许有人可以给我一个关于我的问题的暗示。提前致谢!在core.clj文件中定义的层次结构与在REPL中定义的层次结构

通过一个Leiningen项目加入如下代码:

(derive ::human ::good) 
(derive ::elf ::good) 

在一个REPL会话我执行(使用方法:重装“test.core),所以它被加载则返回nil〜。

(isa? ::human ::good) ; => false???? 

如果我在上面REPL两种形式,并用相同的语法查询层级类型

(isa? ::human ::good) ; => true. 

我应该使用从test.core.clj文件中加载的版本有什么语法? 我已经测试,并通过向core.clj另一种形式

(def x (isa? ::human ::good) ; x is true. 

问候, DG是正确的

回答

1

的原因是,有两个冒号开头的关键字理解为命名空间的关键字,其中命名空间当前名称空间,除非您在短划线之前明确指定名称空间别名。

test.core::human被读作:test.core/human。在REPL中,您很可能位于user命名空间中,所以它被读为:user/human - 一个不同的关键字!

您可以通过(in-ns 'test.core)切换到test.core名称空间。

或者你可以完全限定关键字:

(isa? :test.core/human :test.core/good)

或者你也可以使用别名来test.core

(require '[test.core :as test]) 
(isa? ::test/human ::test/good) ;; notice two colons: alias will be resolved 

或者你不能使用命名空间的关键字。

(derive :human :elf) 

这将是unidiomatic为使用derive没有层次结构的第一个参数将改变全球的层次结构(这是我们不希望与其他乱七八糟的名字)。相反,你可以有自己的层次结构,你完全控制你自己:

(def h (make-hierachy)) 
(derive h :human :elf) 
(isa? h :human :elf) 

正如你可以看到美丽的Clojure提供了许多方法来满足或需要。