(module reverse-stx mzscheme ;; Experiments in writing macros that do keywordy things. (require-for-syntax (lib "stx.ss" "syntax")) (define-for-syntax (stx-reverse original-stx) (let loop ((stx original-stx) (elements ())) (if (stx-null? stx) (datum->syntax-object original-stx elements original-stx) (loop (stx-cdr stx) (cons (stx-car stx) elements))))) (provide list-reverse) (define-syntax (list-reverse stx) (syntax-case stx () ((_ args ...) (with-syntax (((args-rev ...) (stx-reverse (syntax (args ...))))) (syntax/loc stx (list args-rev ...)))))) (define (stx-keyword-get stx keyword . not-found) (let loop ([stx stx]) (cond [(or (stx-null? stx) (stx-null? (stx-cdr stx))) (and (pair? not-found) ((car not-found)))] [(eq? (syntax-e (stx-car stx)) keyword) (stx-car (stx-cdr stx))] [else (loop (stx-cdr stx))]))) (define (stx-positional-args original-stx) (let loop ([stx original-stx] [args ()]) (cond [(or (stx-null? stx) (keyword? (syntax-e (stx-car stx)))) (datum->syntax-object original-stx (reverse args) original-stx)] [else (loop (stx-cdr stx) (cons (stx-car stx) args))]))) ; ;; Return the positional (non-keyword) arguments. ; (define-for-syntax (stx-positional-args-get keywords stx) ; ...) )