为什么 `dir` 不适用于从“当前命名空间变量”获取的当前命名空间 - `*ns*`

tos*_*osh 2 clojure

或者,换句话说,为什么这不起作用:

user=> (dir (ns-name *ns*))
Execution error (ClassCastException) at user/eval2010 (REPL:1).
class clojure.lang.PersistentList cannot be cast to class clojure.lang.Symbol (clojure.lang.PersistentList and clojure.lang.Symbol are in unnamed module of loader 'bootstrap')
Run Code Online (Sandbox Code Playgroud)

Ala*_*son 5

dir是一个需要不带引号的符号作为其参数的宏。它应该像这样使用:


user=> (clojure.repl/dir clojure.string)
blank?
capitalize
escape
join
lower-case
replace
...
Run Code Online (Sandbox Code Playgroud)

当你这样称呼它时:

(ns demo.core
  (:require [clojure.repl :as repl]))

(println (repl/dir (ns-name *ns*)))
Run Code Online (Sandbox Code Playgroud)

您没有传递不带引号的符号(例如clojure.string),而是传递一个以ns-name该符号作为第一个元素的列表。

正如 的命名空间所clojure.repl/dir暗示的那样,该命令旨在手动输入到 REPL 中,而不是以编程方式使用。


如果您确实想以编程方式获取信息,您可能需要更像以下之一的东西:

(ns-publics 'tst.demo.core)
(ns-publics (ns-name *ns*))
Run Code Online (Sandbox Code Playgroud)

其中任何一个都有效。

请务必仔细阅读Clojure CheatSheet和此文档列表。