split-metas

dev-stylish
Matthew Butterick 6 years ago
parent 829f049420
commit a26670c009

@ -1,18 +1,20 @@
#lang racket/base #lang debug racket/base
(require racket/match
racket/list)
(provide (all-defined-out)) (provide (all-defined-out))
(define (split-metas x meta-key) (define (split-metas x meta-key)
(apply hasheq (apply hasheq
(let loop ([x (if (syntax? x) (syntax->datum x) x)]) (let loop ([x ((if (syntax? x) syntax->datum values) x)])
(cond (match x
[(list? x) (cond [(? list? xs)
[(and (= (length x) 3) (eq? (car x) meta-key)) (match xs
(unless (symbol? (cadr x)) [(list (== meta-key eq?) key val)
(raise-argument-error 'define-meta "valid meta key" (cadr x))) (unless (symbol? key)
(cdr x)] ; list with meta key and meta value (raise-argument-error 'define-meta "valid meta key" key))
[else (apply append (map loop x))])] (list key val)]
[else null])))) [_ (append-map loop xs)])]
[_ null]))))
(module+ test (module+ test
(require rackunit) (require rackunit)

@ -1 +1 @@
1540858374 1540858378

Loading…
Cancel
Save