如果我有一个名称空间表单,如何从中提取元数据映射?例如:
(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
。
因此,如果你想获得"docstring,如果有的话",你需要查看名称符号上的元数据,紧随其后的形式(如果有的话;检查它是字符串还是映射),可能还有一个形式(如果一个docstring作为ns
的第二个参数;检查它是否是映射)。