clojure - 如何从 Clojure 命名空间形式解析元数据?

标签 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

因此,如果您想获取“文档字符串,如果有的话”,您需要查看名称符号上的元数据、紧随其后的形式(如果有;检查它是字符串还是映射)以及可能还有另一种形式(如果将文档字符串作为 ns 的第二个参数给出;检查它是否是 map )。

关于clojure - 如何从 Clojure 命名空间形式解析元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20698628/

相关文章:

sql - Clojure 和 HugSQL;如何提供SQL关键字?

concurrency - Clojure 删除 ref 内向量的第一个(或最后一个)元素

list - conj 在 Clojure 中的向量和列表上的行为差异

macros - clojure defmacro 中的多重性

clojure - 将输入映射序列化为字符串

string - Clojure 中惯用的字符串旋转

functional-programming - 哪个函数在堆栈使用效率和时间方面最好

java - 从 Java 调用 clojure (Clojure Interop)

macros - Clojure defmacro 丢失元数据

clojure - 将模式和结果作为向量传递给 core.match/match 的宏