我正在执行' 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
答案 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提供了许多适合或需要的方式。