如何向通过 Clojure 中的 def 定义的序列添加元/注释?

Ham*_*jan 5 metadata function clojure

我不得不注释掉下面的行(示例来自http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci

(def fib-seq
  ;"Implements Fibonacci sequence (starts with 0)."
  ((fn rfib [a b] 
     (lazy-seq (cons a (rfib b (+ a b)))))
   0 1))
Run Code Online (Sandbox Code Playgroud)

如果我把它留在里面,我会得到:

Clojure 1.2.0
java.lang.Exception: Too many arguments to def (Problem1.clj:1)
1:1 user=>
Run Code Online (Sandbox Code Playgroud)

但是,我可以用 来做到这一点defn。示例(我知道,我正在重新发明轮子,even?因为已经定义了):

(defn is-even? [n]
  "Returns true if the number is even, false otherwise."
  (== (mod n 2) 0))


Clojure 1.2.0
1:1 user=> (is-even? 3)
false
1:2 user=> (is-even? 4)
true
1:3 user=>
Run Code Online (Sandbox Code Playgroud)

May*_*iel 5

(def ^{:doc "Implements Fib. sequence lazily."} fibs ...)

(:doc (meta (var fibs)))

; "Implements Fib. sequence lazily."


编写宏很简单,因此您可以编写(def-with-docs foo "doc" 1).

(defmacro def-with-docs [name docstring value]
  `(def ~(with-meta name {:doc docstring}) ~value))

(def-with-docs fib-seq "Implements Fibbonaci sequence (starts with 0)."
  ((fn rfib [a b] (lazy-seq (cons a (rfib b (+ a b))))) 0 1))
Run Code Online (Sandbox Code Playgroud)

(:doc (meta (var fib-seq)))

; "Implements Fibbonaci sequence (starts with 0)."


另请注意,在使用 的示例中defn,文档字符串应位于参数之前,否则它将不会与符号的元数据关联。


或者,可以使用clojure.contrib.def/defvar