#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))]))