preserves/implementations/racket/preserves/preserves-schema/support.rkt

19 lines
723 B
Racket

#lang racket/base
(provide parse-sequence)
(require racket/match)
(define-match-expander parse-sequence
(syntax-rules ()
[(_ predicate? to-list item-pat item-expr from-list target-pat)
(? predicate? (app (lambda (v)
(let loop ((inputs (to-list v)) (acc-rev '()))
(match inputs
['() (values #t (from-list (reverse acc-rev)))]
[(cons untransformed remainder)
(match untransformed
[item-pat (loop remainder (cons item-expr acc-rev))]
[_ (values #f #f)])])))
#t target-pat))]))