Add syntax lens and exports
This commit is contained in:
parent
9794ee54e4
commit
58a6f214d0
|
@ -1,6 +1,10 @@
|
|||
#lang racket
|
||||
|
||||
(require)
|
||||
(require "core.rkt"
|
||||
"list.rkt"
|
||||
"syntax.rkt")
|
||||
|
||||
(provide
|
||||
(all-from-out))
|
||||
(all-from-out "core.rkt"
|
||||
"list.rkt"
|
||||
"syntax.rkt"))
|
||||
|
|
37
lenses/syntax.rkt
Normal file
37
lenses/syntax.rkt
Normal file
|
@ -0,0 +1,37 @@
|
|||
#lang racket
|
||||
|
||||
(require syntax/parse
|
||||
(for-syntax racket/syntax
|
||||
syntax/stx
|
||||
syntax/parse))
|
||||
|
||||
(provide syntax-lens)
|
||||
|
||||
(define-syntax syntax-lens
|
||||
(syntax-parser
|
||||
[(_ target-name:id template)
|
||||
(with-syntax* ([target ((target-stx #'target-name) #'template)]
|
||||
[parse-pattern (template->pattern #'template)]
|
||||
[rebuilder ((template-rebuilder #'target-name) #'parse-pattern)])
|
||||
#'(syntax-parser
|
||||
[parse-pattern
|
||||
(values #'target rebuilder)]))]))
|
||||
|
||||
(begin-for-syntax
|
||||
|
||||
(define (target-stx target-id)
|
||||
(syntax-parser
|
||||
[(a ...) (ormap (target-stx target-id) (syntax->list #'(a ...)))]
|
||||
[a (and (bound-identifier=? target-id #'a) #'a)]))
|
||||
|
||||
(define template->pattern
|
||||
(syntax-parser #:literals (_)
|
||||
[(a ...) #`(#,@(stx-map template->pattern #'(a ...)))]
|
||||
[_ (generate-temporary)]
|
||||
[a #'a]))
|
||||
|
||||
(define ((template-rebuilder target-id) parse-pattern)
|
||||
(with-syntax ([pat parse-pattern])
|
||||
#`(lambda (stx)
|
||||
(with-syntax ([#,target-id stx])
|
||||
#'pat)))))
|
Loading…
Reference in New Issue
Block a user