为什么 `dir` 不适用于从 "current namespace var" 获得的当前命名空间 - `*ns*`
Why does `dir` not work with current namespace gotten from "current namespace var" - `*ns*`
或者,换句话说,为什么这不起作用:
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')
dir
是一个宏,它需要一个不带引号的符号作为它的参数。它应该像这样使用:
user=> (clojure.repl/dir clojure.string)
blank?
capitalize
escape
join
lower-case
replace
...
当你这样称呼它时:
(ns demo.core
(:require [clojure.repl :as repl]))
(println (repl/dir (ns-name *ns*)))
您传递的不是不带引号的符号(例如 clojure.string
),而是以符号 ns-name
作为第一个元素的列表。
正如 clojure.repl/dir
的命名空间所暗示的那样,此命令旨在通过手动输入到 REPL 中,而不是以编程方式使用。
如果您确实想以编程方式获取信息,您可能需要更像以下之一的东西:
(ns-publics 'tst.demo.core)
(ns-publics (ns-name *ns*))
两者都有效。
一定要仔细阅读 Clojure CheatSheet and this list of documentation。
或者,换句话说,为什么这不起作用:
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')
dir
是一个宏,它需要一个不带引号的符号作为它的参数。它应该像这样使用:
user=> (clojure.repl/dir clojure.string)
blank?
capitalize
escape
join
lower-case
replace
...
当你这样称呼它时:
(ns demo.core
(:require [clojure.repl :as repl]))
(println (repl/dir (ns-name *ns*)))
您传递的不是不带引号的符号(例如 clojure.string
),而是以符号 ns-name
作为第一个元素的列表。
正如 clojure.repl/dir
的命名空间所暗示的那样,此命令旨在通过手动输入到 REPL 中,而不是以编程方式使用。
如果您确实想以编程方式获取信息,您可能需要更像以下之一的东西:
(ns-publics 'tst.demo.core)
(ns-publics (ns-name *ns*))
两者都有效。
一定要仔细阅读 Clojure CheatSheet and this list of documentation。