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

Clojure core.clj文件中定义的层次结构与REPL中定义的层次结构,clojure,Clojure,我正在执行《实用Clojure》一书中的代码,但我对层次结构有些不了解。也许有人能就我的问题给我一个提示。提前谢谢 通过在一个Leiningen项目中添加以下代码: (derive ::human ::good) (derive ::elf ::good) 在一个REPL会话中,我正在执行(use:reload'test.core),它返回nil~因此被加载 (isa? ::human ::good) ; => false???? 如果我在REPL中键入上述两种形式,并使用相同的语

我正在执行《实用Clojure》一书中的代码,但我对层次结构有些不了解。也许有人能就我的问题给我一个提示。提前谢谢

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

 (derive ::human ::good)
 (derive ::elf ::good)
在一个REPL会话中,我正在执行(use: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

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

test.core
::human
中读作
:test.core/human
。在REPL中,您很可能位于
用户
名称空间中,因此它被解读为
:user/human
——一个不同的关键字

您可以通过
(在ns的test.core中)
切换到
test.core
命名空间

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

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

或者您可以使用别名
测试.core

(require '[test.core :as test])
(isa? ::test/human ::test/good) ;; notice two colons: alias will be resolved
或者,您不能使用带名称空间的关键字

(derive :human :elf)
这将是不规则的,因为使用没有层次结构的
derivate
,因为第一个参数将更改全局层次结构(我们不想与其他名称混淆)。相反,你可以拥有自己的等级制度,完全由你自己控制:

(def h (make-hierachy))
(derive h :human :elf)
(isa? h :human :elf)
正如你所看到的,美丽的Clojure提供了许多方法来满足你的需求