Что выводит команда clojure "doc"? - PullRequest
0 голосов
/ 27 мая 2019

Я немного сбит с толку из-за clojure doc.

. Вывод - это спецификация аргументов, использующая традиционную базовую разметку регулярного выражения , которая:

  • *: 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. Действительное выражение Structure (fn name? [params*] exprs*)
  3. Другая возможная структура выражений (fn name? ([params*] exprs*) +)

Но тогда есть неотступенчатый ([& sigs]).О чем это?

Последующий вывод также нуждается в очистке.А что за "Spec"?

Для (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 Ответ

2 голосов
/ 27 мая 2019

Это списки параметров для функций.

Из источника :

Code from the definition of the 'fn' macro

([& sigs]) говорит, что для этого требуется переменный список "(sig) природ". «Подпись» в данном случае относится к примеру формы на предыдущих строках. Либо ([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 имеет несколько арностей.


Что касается того, почему letfn показывает ([fnspec & body]), это способ, который он определен в источнике :

Code from the definition of the 'letfn' macro

fnspecs - первый параметр, и любые аргументы, предоставленные после него, сгруппированы в список body var-arg. Возможно, вам придется просмотреть синтаксис var-arg Clojure .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...