顺便一提,注意,这样的关键字的一部分通常被称为“命名空间”,它根本不必是一个现有的命名空间。官方 Clojure 文档(例如在这个页面 https://clojure.org/reference/reader )称它们为有资格的关键字,而且关键字名称中 '/' 前的部分是限定符。
其中一个原因是,虽然限定符可以与程序中的命名空间相同,但它根本不必是一个命名空间。
在 Clojure/Java 中,所有关键字在读或创建时都会被'内部化',这意味着所有具有同一名称的关键字在内存中都是相同的Java对象。为了实现这一点,所有关键字都存储在公共表中。你可以在 Clojure 实现的 Java 文件 Keyword.java
中看到这一点,命名为 table
。它被声明为私有,并且除了通过intern
创建新关键字和通过find
查看是否存在特定名称的关键字之外,没有公共方法可以访问它。
使用Java反射API绕过private
限制相对简单,除非你的JVM是用防止这种操作的选项启动的。可以利用这些方法来访问私有table
字段的值,遍历其所有条目,并将它们全部返回,然后你可以使用Clojure或Java代码来过滤,只保留你感兴趣的部分。
我对ClojureScript中关键字实现的了解不足以说明那边的可能性。