Clojure:名称空间元数据

时间:2013-09-17 23:34:20

标签: clojure

如何获取命名空间元数据?在repl中我做:

=> (in-ns my.test)
#<Namespace my.test>
=> (meta *ns*)
{:a "hello"}
=> ; Return back to repl namespace:
   (in-ns 'user)
   ; Or use 'with-ns

我的命名空间定义是:

(ns ^{:a "hello"} my.test
  ...)

任何(meta #'my.test)个变体都会失败,尽管它适用于def个实体。我可以理解(ns...)没有定义变量而*ns*是一个我不能在外面引用的特殊变量,但我怀疑究竟发生了什么。

1 个答案:

答案 0 :(得分:2)

AFAICT存在一个长期存在的问题,即传递给ns表单的符号名称附加的元数据未正确附加到命名空间对象。

作为替代方案,您可以将其他参数传递给ns

(ns foo.core
  "This is foo.core's excellent docstring."
  {:interesting "piece of metadata"}
  (:require [bar.core :as bar]))

此样式按预期工作。我也碰巧发现它更美观。

NB。引入命名对象的其他Clojure宏也倾向于以这种方式接受额外的docstring / metadata参数:

(defn foo
  "A particularly lucid docstring for foo."
  {:trivia "The first function named foo was written in ..."}
  []
  ; ...
  )