我对clojure的doc
感到困惑。
输出是使用传统的basic regular expression markup的参数说明,
*
:标记的前一个元素(“许多”)的0..n个实例?
:标记的前一个元素的0..1实例(“可选”)+
:标记的前一个元素(“至少一个”)的1..n个实例括号()
和方括号[]
应“按原样”使用,以形成正确的表达式或形式,并且不用于对任何正则表达式元素进行分组。
如果有几个有效的参数组合,它们会在多行中列出。
但是例如观察(doc fn)
的输出:
clojure.core/fn
(fn name? [params*] exprs*)
(fn name? ([params*] exprs*) +)
([& sigs])
Special Form
params => positional-params* , or positional-params* & next-param
positional-param => binding-form
next-param => binding-form
name => symbol
Defines a function
Please see http://clojure.org/special_forms#fn
params => positional-params* , or positional-params* & next-param
positional-param => binding-form
next-param => binding-form
name => symbol
Defines a function
Spec
args: (cat :fn-name (? simple-symbol?) :fn-tail (alt :arity-1 :clojure.core.specs.alpha/params+body :arity-n (+ (spec :clojure.core.specs.alpha/params+body))))
ret: any?
nil
前三行的含义如下:
(fn name? [params*] exprs*)
(fn name? ([params*] exprs*) +)
但是随后有一个非缩进的([& sigs])
。那是什么呢?
随后的输出似乎也需要清理。什么是“规格”?
对于(doc doc)
:
clojure.repl/doc
([name])
Macro
Prints documentation for a var or special form given its name,
or for a spec if given a keyword
nil
我不理解非缩进的([name])
。
或者让我们尝试(doc letfn)
:
clojure.core/letfn
(letfn [fnspecs*] exprs*)
([fnspecs & body])
Special Form
fnspec ==> (fname [params*] exprs) or (fname ([params*] exprs)+)
Takes a vector of function specs and a body, and generates a set of
bindings of functions to their names. All of the names are available
in all of the definitions of the functions, as well as the body.
fnspec ==> (fname [params*] exprs) or (fname ([params*] exprs)+)
Takes a vector of function specs and a body, and generates a set of
bindings of functions to their names. All of the names are available
in all of the definitions of the functions, as well as the body.
nil
我还不清楚([fnspecs & body])
的含义。
答案 0 :(得分:2)
这些是函数的参数列表。
来自the source:
([& sigs])
说,它采用了“(签名)自然”的可变列表。在这种情况下,“签名”指的是前几行中的示例表格。 ([params] body)
用于创建具有单个参数列表的函数,或者(([params] body) ([other-params] body)
列表用于创建具有多个参数列表的函数。
doc
只是说doc
接受name
作为参数。
最后,letfn
表示它需要一个“ fnspecs
”向量和各种body
表达式。您可以看到它的用法:
(letfn [(some-function [param] ; The vector on these two lines is "fnspecs"
(println param))]
(println "PRINTING!") ; These two lines are grouped into "body"
(some-function 1))
它有一个外部括号,因为它显示了所有可用参数列表的列表。 doc
显示([name])
(一个向量的列表),因为它只有一个有效的参数列表。不过,如果您在文档中查找像max
这样的函数,则:
clojure.core/max
([x] [x y] [x y & more])
Returns the greatest of the nums.
它列出了多个参数列表,因为max
具有多个Arities。
关于letfn
显示([fnspec & body])
的原因,那就是way that it's defined in the source:
fnspecs
是第一个参数,其后提供的所有参数都分组到body
var-arg列表中。您可能需要查看Clojure's var-arg syntax。