Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 56s
(project (vars ...) goal ...) defmacro walks each named var via mk-walk*, rebinds them in the body's lexical scope, then mk-conjs the body goals on the same substitution. Hygienic — gensym'd s-param so user vars survive. Lets you reach into host SX for arithmetic, string ops, anything that needs a ground value: (project (n) (== q (* n n))), (project (s) (== q (str s \"!\"))), and so on. 6 new tests, 194/194 cumulative.
61 lines
1.1 KiB
Plaintext
61 lines
1.1 KiB
Plaintext
;; lib/minikanren/tests/project.sx — Phase 5 piece B tests for `project`.
|
|
|
|
;; --- project rebinds vars to ground values for SX use ---
|
|
|
|
(mk-test
|
|
"project-square-via-host"
|
|
(run* q (fresh (n) (== n 5) (project (n) (== q (* n n)))))
|
|
(list 25))
|
|
|
|
(mk-test
|
|
"project-multi-vars"
|
|
(run*
|
|
q
|
|
(fresh
|
|
(a b)
|
|
(== a 3)
|
|
(== b 4)
|
|
(project (a b) (== q (+ a b)))))
|
|
(list 7))
|
|
|
|
(mk-test
|
|
"project-with-string-host-op"
|
|
(run* q (fresh (s) (== s "hello") (project (s) (== q (str s "!")))))
|
|
(list "hello!"))
|
|
|
|
;; --- project nested inside conde ---
|
|
|
|
(mk-test
|
|
"project-inside-conde"
|
|
(run*
|
|
q
|
|
(fresh
|
|
(n)
|
|
(conde ((== n 3)) ((== n 4)))
|
|
(project (n) (== q (* n 10)))))
|
|
(list 30 40))
|
|
|
|
;; --- project body can be multiple goals (mk-conj'd) ---
|
|
|
|
(mk-test
|
|
"project-multi-goal-body"
|
|
(run*
|
|
q
|
|
(fresh
|
|
(n)
|
|
(== n 7)
|
|
(project (n) (== q (+ n 1)) (== q (+ n 1)))))
|
|
(list 8))
|
|
|
|
(mk-test
|
|
"project-multi-goal-body-conflict"
|
|
(run*
|
|
q
|
|
(fresh
|
|
(n)
|
|
(== n 7)
|
|
(project (n) (== q (+ n 1)) (== q (+ n 2)))))
|
|
(list))
|
|
|
|
(mk-tests-run!)
|