From 58a6f214d0a5c42cd1a1b83b8eca08494f34cea6 Mon Sep 17 00:00:00 2001 From: JackFirth Date: Sun, 22 Feb 2015 18:13:26 -0800 Subject: [PATCH] Add syntax lens and exports --- lenses/main.rkt | 8 ++++++-- lenses/syntax.rkt | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 lenses/syntax.rkt diff --git a/lenses/main.rkt b/lenses/main.rkt index 523526a..1ca87c9 100644 --- a/lenses/main.rkt +++ b/lenses/main.rkt @@ -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")) diff --git a/lenses/syntax.rkt b/lenses/syntax.rkt new file mode 100644 index 0000000..c90e8ce --- /dev/null +++ b/lenses/syntax.rkt @@ -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))))) \ No newline at end of file