core.clj文件中定义的层次结构与REPL中定义的层次结构

时间:2014-03-31 04:41:52

标签: clojure

我正在执行' Practical Clojure'书,有一些我不了解的等级制度。也许有人可以给我一个关于我的问题的提示。提前谢谢!

在一个Leiningen项目中添加以下代码:

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

在一个REPL会话中,我正在执行(使用:reload' 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 个答案:

答案 0 :(得分:1)

原因是以两个冒号开头的关键字被读作命名空间关键字,其中命名空间是当前命名空间,除非您在破折号之前明确指定命名空间别名。

test.core ::human中,读为:test.core/human。在REPL中,您最有可能位于user命名空间中,因此它被视为:user/human - 一个不同的关键字!

您可以通过test.core切换到(in-ns '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)

这将是一致的,因为使用derive没有层次结构,因为第一个参数将改变全局层次结构(我们不希望与其他名称混淆)。相反,你可以拥有自己完全靠自己控制的层次结构:

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

正如您所看到的,美丽的Clojure提供了许多适合或需要的方式。