我想弄清楚clojure.lang和clojure.core之间的区别。
例如,in-ns函数位于clojure.lang
中> in-ns
=> #< clojure.lang.RT$1@bc647a2>
但是create-ns函数在clojure.core中
> create-ns
=> #<core$create_ns clojure.core$create_ns@6945af1f>
虽然我可以在clojure.core上做ns-interns,但知道属于它的是什么
> (ns-interns 'clojure.core)
=> {sorted-map (var clojure.core/sorted-map), ... }
它不能使用clojure.lang
> (ns-interns 'clojure.lang)
Exception No namespace: lang found clojure.core/the-ns (core.clj:3760)
不幸的是,在文档中,所有看起来好像是clojure.core的一部分 (example1,example2)
现在,我正在尝试在clojure.lang之上实现一种新语言,所以我使用create-ns来获取一个没有clojure.core的命名空间(但它确实有clojure.lang,说得通)。但后来我想知道clojure.lang有什么,我无法弄清楚clojure.core和clojure.lang中的内容。
那么clojure.lang中有什么?
编辑:
正如下面的cgrand所示,in-ns也是clojure.core命名空间的一部分。但这并不能说明我想知道的事情。
当我使用(create-ns&#39; name-of-namespace)创建一个新的空命名空间时,在其中定义了哪些函数和宏?
答案 0 :(得分:2)
clojure.lang
是一个包含Clojure实现类的java包。
clojure.core
是定义语言核心的clojure名称空间。
当您看到#< clojure.lang.RT$1@bc647a2>
时,它只意味着in-ns
拥有clojure.lang.RT.java
中匿名定义的内容。但是:
=> (meta #'in-ns)
{:added "1.0", :ns #<Namespace clojure.core>, :name in-ns, :doc "Sets *ns* to the namespace named by the symbol, creating it if needed.", :arglists ([name])}
表明in-ns
属于clojure.core
。
答案 1 :(得分:0)
您可以使用ns-map获取命名空间中定义的所有符号的列表。 这将显示命名空间中定义的所有符号。
`(keys (ns-map 'namespace))`
显示命名空间中的所有函数(不是宏)。
`(filter #(ifn? %) (keys (ns-map 'namespace)))