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)
(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。