From 96c391866be3f7a46cc70b7dff3cb4f28a6fa2e5 Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Sun, 5 Jul 2015 15:57:02 -0700 Subject: [PATCH] Fix syntax lenses --- lenses/syntax.rkt | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/lenses/syntax.rkt b/lenses/syntax.rkt index 2c71ae8..a8a7a5b 100644 --- a/lenses/syntax.rkt +++ b/lenses/syntax.rkt @@ -10,15 +10,32 @@ (provide syntax-lens) -(define-syntax syntax-lens +(define-syntax syntax-lens-getter + (syntax-parser + [(_ target-name:id template) + (with-syntax* ([target ((target-stx #'target-name) #'template)] + [parse-pattern (template->pattern #'template)]) + #'(syntax-parser + [parse-pattern + #'target]))])) + +(define-syntax syntax-lens-setter (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)]))])) + #'(λ (stx new-view) + (syntax-parse stx + [parse-pattern + (rebuilder new-view)])))])) + + +(define-syntax syntax-lens + (syntax-parser + [(_ target-name:id template) + #'(make-lens (syntax-lens-getter target-name template) + (syntax-lens-setter target-name template))])) (module+ test (define stx-lens (syntax-lens A (_ _ (_ _ A _ _) _ ...)))