refactor define-nested-lenses
to factor out handling definitions into the syntax class
This commit is contained in:
parent
fa37f47add
commit
1f2241c3ce
|
@ -21,40 +21,31 @@ begin-for-syntax
|
||||||
(define -lens (update-source-location (datum->syntax #f '-lens)
|
(define -lens (update-source-location (datum->syntax #f '-lens)
|
||||||
#:span 5))
|
#:span 5))
|
||||||
;; helper syntax-class for define-nested-lenses
|
;; helper syntax-class for define-nested-lenses
|
||||||
(define-syntax-class (clause base-id)
|
(define-syntax-class (clause base-id base-lens-tmp)
|
||||||
|
#:attributes (def)
|
||||||
[pattern [suffix-id:id suffix-lens-expr:expr]
|
[pattern [suffix-id:id suffix-lens-expr:expr]
|
||||||
|
#:with base-lens:id base-lens-tmp
|
||||||
#:do [(define-values [base-suffix-lens-id sub-range-binders]
|
#:do [(define-values [base-suffix-lens-id sub-range-binders]
|
||||||
(id-append #:context base-id
|
(id-append #:context base-id
|
||||||
base-id -- #'suffix-id -lens))]
|
base-id -- #'suffix-id -lens))]
|
||||||
#:with [base-suffix-lens ...]
|
#:with base-suffix-lens
|
||||||
(list base-suffix-lens-id)
|
base-suffix-lens-id
|
||||||
#:with [suffix-lens ...]
|
#:with def
|
||||||
(list #'suffix-lens-expr)
|
(with-sub-range-binders
|
||||||
#:attr sub-range-binders
|
#`(define base-suffix-lens
|
||||||
sub-range-binders])
|
(lens-thrush base-lens suffix-lens-expr))
|
||||||
|
sub-range-binders)])
|
||||||
|
|
||||||
|
|
||||||
(define-syntax define-nested-lenses
|
(define-syntax define-nested-lenses
|
||||||
(syntax-parser
|
(syntax-parser
|
||||||
[(define-nested-lenses [base:id base-lens-expr:expr]
|
[(define-nested-lenses [base:id base-lens-expr:expr]
|
||||||
(~var clause (clause #'base))
|
(~parse base-lens:id (generate-temporary #'base))
|
||||||
|
(~var clause (clause #'base #'base-lens))
|
||||||
...)
|
...)
|
||||||
#:with base-lens:id (generate-temporary #'base)
|
|
||||||
#:with [def ...]
|
|
||||||
(for/list ([base-suffix-lens-ids (in-list (syntax->list #'[[clause.base-suffix-lens] ... ...]))]
|
|
||||||
[suffix-lens-exprs (in-list (syntax->list #'[[clause.suffix-lens ...] ...]))]
|
|
||||||
[sub-range-binders-prop (in-list (attribute clause.sub-range-binders))])
|
|
||||||
(define/syntax-parse [base-suffix-lens ...] base-suffix-lens-ids)
|
|
||||||
(define/syntax-parse [suffix-lens ...] suffix-lens-exprs)
|
|
||||||
(with-sub-range-binders
|
|
||||||
#`(begin
|
|
||||||
(define base-suffix-lens
|
|
||||||
(lens-thrush base-lens suffix-lens))
|
|
||||||
...)
|
|
||||||
sub-range-binders-prop))
|
|
||||||
#'(begin
|
#'(begin
|
||||||
(define base-lens base-lens-expr)
|
(define base-lens base-lens-expr)
|
||||||
def
|
clause.def
|
||||||
...)]))
|
...)]))
|
||||||
|
|
||||||
module+ test
|
module+ test
|
||||||
|
|
Loading…
Reference in New Issue
Block a user