如何从Clojure命名空间表单解析元数据



如果我有一个名称空间表单,如何从中提取元数据映射?例如:

(some-function '(ns ^{:doc "docstring"})) => {:doc "docstring"} 

^引入的阅读器元数据附加到下一个要读入的表单中。

您的示例中引用的表单格式错误为Clojure代码(也就是说,甚至没有特别考虑它是ns表单),因为元数据映射本身没有任何附加内容。固定版本可能是(ns ^{:doc "docstring"} foo)。此处,foo成为ns的(强制)"name"参数。

现在,您可以简单地使用secondns表单中提取符号foo,并读取其元数据映射:

(-> '(ns ^{...} foo) second meta)

注意,命名空间的文档字符串可以以ns:的额外参数的形式提供

(ns foo
"foo's docstring"
...)

此外,还可以提供一个额外的"属性映射"作为额外的参数(如果以这种形式给出,则在文档字符串之后,否则在名称符号之后)。该属性映射将与名称符号的元数据合并,并且当然可以包括密钥:doc

因此,如果你想获得"docstring,如果有的话",你需要查看名称符号上的元数据,紧随其后的形式(如果有的话;检查它是字符串还是映射),可能还有一个形式(如果一个docstring作为ns的第二个参数;检查它是否是映射)。

最新更新