Add syntax lens and exports

This commit is contained in:
JackFirth 2015-02-22 18:13:26 -08:00
parent 9794ee54e4
commit 58a6f214d0
2 changed files with 43 additions and 2 deletions

View File

@ -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
View 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)))))