Next: expander utils unwrap, Previous: expander utils vectors, Up: expander utils [Index]
Given a syntax object stx parse it as logic predicate expression with expected format:
stx = (and ?expr0 ?expr ...)
| (or ?expr0 ?expr ...)
| (xor ?expr0 ?expr ...)
| (not ?expr)
| ?expr
where and, or, xor, not are the
identifiers exported by (vicare). If a standalone ?expr
is found: apply the procedure tail-proc to it gather its single
return value; tail-proc defaults to the identity function.
Return a syntax object representing the logic predicate with the standalone expressions replaced by the return values of tail-proc.
(define (tail-proc stx)
(syntax-case stx ()
((?expr0 ?expr ...)
#`(or #,@(map (lambda (expr)
(parse-logic-predicate-syntax
expr tail-proc))
(syntax->list #'(?expr0 ?expr ...)))))
(_
(list #'here stx))))
(define-syntax-rule (doit ?input)
(parse-logic-predicate-syntax (syntax ?input) tail-proc))
(doit (and 1 2))
⇒ #'(and (here 1) (here 2))
(doit (or 1 2))
⇒ #'(or (here 1) (here 2))
(doit (xor 1 2)
⇒ #'(xor (here 1) (here 2))
(doit (not 1))
⇒ (not (here 1))
(doit (and (xor (not 1) 2)
(or (not 3) 4)))
⇒ #'(and (xor (not (here 1)) (here 2))
(or (not (here 3)) (here 4)))
(doit (1 2))
⇒ #'(or (here 1) (here 2))