顺便说一下,这样的关键字通常称为"命名空间"的部分,根本不需要是一个现有的命名空间。官方的Clojure文档(例如在这个页面https://clojure.org/reference/reader)将它们称为限定关键字,而在关键字名称中的'/'之前的部分是限定符。
原因之一是,尽管限定符可以与你的程序中的命名空间相同,但它根本不需要是一个命名空间。
在Clojure/Java中,所有关键字在运行时读取或动态创建时都是'自动装箱'的,这意味着具有相同名称的所有关键字在内存中是相同的唯一Java对象。为了实现这一点,所有关键字都存储在公共表中。你可以在Clojure实现中的Java文件Keyword.java
中看到这一点,命名为table
。它被声明为私有,除了通过intern
创建新关键字,并通过find
检查是否存在具有特定名称的关键字之外,没有公开的访问方法。
使用 Java 反射 API 跳过 private
限制相当简单,除非你的 JVM 是以防止这种操作的安全选项启动的。可以利用这些方法访问那个私有的 table
字段的值,遍历其中的所有条目,然后返回它们,然后你可以使用 Clojure 或 Java 代码来过滤这些数据,只保留你感兴趣的部分。
我对 ClojureScript 中关键词的实现知之甚少,无法确定那里可以做些什么。