::在clojure中用于什么?

::在clojure中用于什么?,clojure,Clojure,我理解Clojure中的关键字是:关键字。但是:用于什么呢?为什么它看起来像是有约束力的 user=>:foo :foo user=>::foo :user/foo 双冒号与当前名称空间在一起。这是为了避免对不同库有意义的关键字的名称冲突。如果没有完全限定的关键字,您可能会意外地覆盖映射中的某些值,并破坏与库的兼容性。正如现在所述,:关键字也可用于解析命名空间别名。例如,如果foo是clojure.core的别名,则::foo/bar将计算为:clojure.core/bar。如果foo未解析为

我理解Clojure中的关键字是
:关键字
。但是
用于什么呢?为什么它看起来像是有约束力的

user=>:foo
:foo
user=>::foo
:user/foo

双冒号与当前名称空间在一起。这是为了避免对不同库有意义的关键字的名称冲突。如果没有完全限定的关键字,您可能会意外地覆盖映射中的某些值,并破坏与库的兼容性。

正如现在所述,
关键字也可用于解析命名空间别名。例如,如果
foo
clojure.core
的别名,则
::foo/bar
将计算为
:clojure.core/bar
。如果
foo
未解析为名称空间,则会引发读取器异常。

至于提供的基本原理,不太清楚为什么首先要修补库应该为其处理的映射。如果这真的是主要动机,那么一些说明可能会有所帮助。一个例子是中间件(类似于Servlet过滤器),使用它可以丰富描述HTTP请求的映射。名称空间键允许您编写自定义中间件以添加额外值,而无需担心与ring应用程序中配置的任何其他中间件的干扰。该功能在此处有文档记录——这也是相关的,因为Clojure 1.9是
::
语法,它与地图一起用于解析地图中的关键字,如前所述。