clojure的“ doc”命令输出什么?

时间:2019-05-26 21:26:26

标签: clojure

我对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

前三行的含义如下:

  1. var 特殊格式
  2. 的包装和名称
  3. 有效的表达式结构(fn name? [params*] exprs*)
  4. 另一个可能的表达式结构(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])的含义。

1 个答案:

答案 0 :(得分:2)

这些是函数的参数列表。

来自the source

Code from the definition of the 'fn' macro

([& 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

Code from the definition of the 'letfn' macro

fnspecs是第一个参数,其后提供的所有参数都分组到body var-arg列表中。您可能需要查看Clojure's var-arg syntax