如果我有名称空间表单,如何从中提取元数据映射?例如:
(some-function '(ns ^{:doc "docstring"})) => {:doc "docstring"}
Run Code Online (Sandbox Code Playgroud)
^随附的阅读器元数据将附加到下一个要阅读的表单中。
在您的示例中,带引号的格式的格式不正确,是Clojure代码(也就是说,甚至不认为它是ns特定的格式),因为元数据映射没有附加的内容。固定版本可能是(ns ^{:doc "docstring"} foo)。这foo将成为的(强制性)“名称”参数ns。
现在,您可以使用例如说的简单地foo从ns表单中提取符号,second并读取其元数据映射:
(-> '(ns ^{...} foo) second meta)
Run Code Online (Sandbox Code Playgroud)
请注意,可以以以下形式的额外参数形式提供名称空间的文档字符串ns:
(ns foo
"foo's docstring"
...)
Run Code Online (Sandbox Code Playgroud)
另外,可以提供一个额外的“属性映射”作为一个额外的参数(如果以这种形式给出文档字符串,则紧随文档字符串之后,否则紧随名称符号之后)。该属性映射将与名称符号的元数据合并,并且当然可以包含键:doc。
因此,如果要获取“文档字符串,如果有的话”,则需要查看名称符号上的元数据,紧随其后的表单(如果有,请检查它是字符串还是映射)以及可能的其他形式形式(如果docstring作为第二个参数给出ns;请检查它是否是映射)。