clojure.lang中有什么?

时间:2014-03-17 10:30:15

标签: clojure

我想弄清楚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的一部分 (example1example2

现在,我正在尝试在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)创建一个新的空命名空间时,在其中定义了哪些函数和宏?

2 个答案:

答案 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)))