Давайте рассмотрим синтаксическую ошибку или две:
user=> (defn)
Syntax error macroexpanding clojure.core/defn at (REPL:1:1).
() - failed: Insufficient input at: [:fn-name] spec: :clojure.core.specs.alpha/defn-args
И
user=> (fn [3]) Syntax error macroexpanding clojure.core/fn at (REPL:1:1).
(3) - failed: Extra input at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
3 - failed: vector? at: [:fn-tail :arity-n :params] spec: :clojure.core.specs.alpha/param-list
Понятно, что синтаксис основных макросов теперь (версия 1.10) проверяется с помощью clojure.spec
.Если и когда проект Clojure в Clojure продвинется, мы можем ожидать, что spec
расширит область его действия до самого компилятора.
Дело в том, что spec
имеет полную мощность EBNF, поэтому исходный код будет содержать полную EBNF языка.Обозначения объясняются в Clojure - clojure.spec: Обоснование и обзор :
Последовательности
Спецификации для последовательностей / векторов используют набор стандартных операторов регулярных выраженийсо стандартной семантикой регулярных выражений:
cat - a concatenation of predicates/patterns
alt - a choice of one among a set of predicates/patterns
* - zero or more occurrences of a predicate/pattern
+ - one or more
? - one or none
& - takes a regex op and further constrains it with one or more predicates
Когда это произойдет?У меня (совершенно неосведомленное) впечатление, что основная команда тонет в аллигаторах и почти забыла свое первоначальное намерение осушить это болото.
Предыдущий ответ, относящийся к spec
в общих терминах для Clojure 1.9, был удален.Я думаю, что его использование для определения и проверки синтаксиса макросов является новым с 1.10.