如果我有一个命名空间表单,如何从中提取元数据映射?例如:
(some-function '(ns ^{:doc "docstring"})) => {:doc "docstring"}
最佳答案
使用 ^
引入的读取器元数据附加到要读入的下一个表单。
示例中引用的形式是错误的 Clojure 代码(也就是说,甚至不考虑它是一个 ns
形式),因为元数据映射没有任何附加内容。固定版本可能是 (ns ^{:doc "docstring"} foo)
。这里 foo
成为 ns
的(强制)“name”参数。
现在您可以简单地使用 second
从 ns
形式中提取符号 foo
并读取其元数据映射:
(-> '(ns ^{...} foo) second meta)
请注意,命名空间的文档字符串可以以 ns
的额外参数的形式提供:
(ns foo
"foo's docstring"
...)
此外,还可以提供额外的“属性映射”作为额外参数(如果以这种形式给出,则在文档字符串之后,否则紧接在名称符号之后)。该属性映射将与名称符号的元数据合并,当然可能包括键 :doc
。
因此,如果您想获取“文档字符串,如果有的话”,您需要查看名称符号上的元数据、紧随其后的形式(如果有;检查它是字符串还是映射)以及可能还有另一种形式(如果将文档字符串作为 ns
的第二个参数给出;检查它是否是 map )。
关于clojure - 如何从 Clojure 命名空间形式解析元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20698628/