如果我有命名空间表单,如何从中提取元数据映射?例如:
(some-function '(ns ^{:doc "docstring"})) => {:doc "docstring"}
答案 0 :(得分:5)
随^
引入的阅读器元数据附加到下一个要阅读的表单中。
您的示例中引用的表单格式不正确,因为Clojure代码(即,甚至没有考虑它特别是ns
形式),因为元数据映射没有任何附加到自身的内容。固定版本可能是(ns ^{:doc "docstring"} foo)
。这里foo
成为ns
的(强制)“名称”参数。
现在,您只需使用foo
从ns
表单中提取符号second
,然后阅读其元数据映射:
(-> '(ns ^{...} foo) second meta)
请注意,名称空间的文档字符串可以以ns
的额外参数的形式提供:
(ns foo
"foo's docstring"
...)
此外,可以提供额外的“属性映射”作为额外参数(如果以此形式给出,则在文档字符串之后,紧跟在名称符号之后)。此属性映射将与名称符号的元数据合并,当然可以包含密钥:doc
。
因此,如果你想获得“docstring,如果有的话”,你需要查看名称符号的元数据,紧跟其后的表格(如果有的话;检查它是字符串还是地图)和可能还有一个表单(如果将文档字符串作为ns
的第二个参数给出;检查它是否是地图)。