Некоторые конструкторы core.logic(matcha
, matche
, matchu
, defne
, fne
) используют выражения соответствия шаблону как тела и могут использоваться, например:
(run* [q]
(fresh [a o]
(== a [1 2 3 4 5])
(matche [a]
([ [1 2 . [3 4 5] ]]
(== q "first"))
([ [1 2 3 . [4 5] ]]
(== q "second"))
([ [1 . _] ]
(== q "third")))))
;=> ("first"
; "second"
; "third")
(пример из Wikic-Starter wiki)
Но я не могу найти спецификацию синтаксиса для сопоставления шаблонов в документации по core.logic. Что это за синтаксис? Может быть, я могу найти его в некоторых документах или книгах minikanren?
- В чем разница между согласованными переменными с префиксом
?
и без нее? - Существуют ли какие-либо другие разрушающие конструкции в дополнение к спискам с
.
(аналогично&
в clojure)? - Будет ли
[_ _]
соответствовать только последовательности с двумя элементами? - Можно ли разрушать карты?