From 1d28c3c3d63acc95e00113cf1ffe07adaa36000a Mon Sep 17 00:00:00 2001 From: Meng Zhang Date: Tue, 20 Dec 2016 17:53:50 -0800 Subject: [PATCH 1/2] Add support for syntax-case --- define-library.scm | 27 ++++++++++++++------------- when-unless.scm | 7 ++++--- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/define-library.scm b/define-library.scm index 03cfbe9..beb8f48 100644 --- a/define-library.scm +++ b/define-library.scm @@ -16,6 +16,8 @@ (##include "syntax.scm") (##include "syntaxrulesxform.scm") +(##include "syntaxcasexform.scm") +(##include "syntaxxform.scm") (define-runtime-syntax define-syntax (lambda (src) @@ -28,6 +30,12 @@ (define-runtime-syntax syntax-rules syn#syntax-rules-form-transformer) +(define-runtime-syntax syntax-case + syn#syntax-case-form-transformer) + +(define-runtime-syntax syntax + (lambda (src) (syn#syntax-form-transformer src '()))) + ;;;============================================================================ (define (keep keep? lst) @@ -582,29 +590,25 @@ (pair? (cdr expr)) (symbol? (##source-strip (cadr expr))) (pair? (cddr expr)) - (let ((x (##source-strip (caddr expr)))) - (and (pair? x) - (eq? (##source-strip (car x)) 'syntax-rules))) (null? (cdddr expr)))) (done) (let ((id (##source-strip (cadr expr))) - (crules (syn#syntax-rules->crules (caddr expr)))) + (form (caddr expr))) - (define (generate-local-macro-def id crules expr-src) + (define (generate-local-macro-def id form expr-src) (let ((locat (##source-locat expr-src))) (##make-source `(##define-syntax ,id - (##lambda (##src) - (syn#apply-rules ',crules ##src))) + ,form) locat))) ;; replace original define-syntax by local macro def ;; to avoid having to load syntax-rules implementation (set-car! expr-srcs - (generate-local-macro-def id crules expr-src)) + (generate-local-macro-def id form expr-src)) (loop (cdr expr-srcs) - (cons (cons id crules) + (cons (cons id form) rev-macros)))))))) (let ((form (##source-strip src))) @@ -684,10 +688,7 @@ (string-append (idmap-namespace idmap) (symbol->string id))) - (##lambda (src) - (syn#apply-rules - (##quote ,(cdr m)) - src)))) + ,(cdr m))) '()))) (idmap-macros idmap)))))) diff --git a/when-unless.scm b/when-unless.scm index c38f650..24780ba 100644 --- a/when-unless.scm +++ b/when-unless.scm @@ -12,9 +12,10 @@ (begin (define-syntax when - (syntax-rules () - ((_ test expr expr* ...) - (if test (begin expr expr* ...))))) + (lambda (x) + (syntax-case x () + ((_ test e e* ...) + #'(if test (begin e e* ...)))))) (define-syntax unless (syntax-rules () From 0e676780149944887feab1a7981c88b0df71d2fe Mon Sep 17 00:00:00 2001 From: Meng Zhang Date: Tue, 20 Dec 2016 18:30:10 -0800 Subject: [PATCH 2/2] Add macro support --- define-library.scm | 8 ++++++++ test.scm | 6 +++++- when-unless.scm | 5 ++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/define-library.scm b/define-library.scm index beb8f48..e7f54fb 100644 --- a/define-library.scm +++ b/define-library.scm @@ -36,6 +36,14 @@ (define-runtime-syntax syntax (lambda (src) (syn#syntax-form-transformer src '()))) +(define-runtime-syntax macro + (lambda (src) + (let ((locat (##source-locat src))) + (##make-source + `(##lambda (##src) + (##apply (##lambda ,@(cdr (##source-strip src))) (##cdr (##source-strip ##src)))) + locat)))) + ;;;============================================================================ (define (keep keep? lst) diff --git a/test.scm b/test.scm index d702dfc..46f746b 100644 --- a/test.scm +++ b/test.scm @@ -15,6 +15,7 @@ (begin (define skip-test #f) + (define z 10) (unless skip-test @@ -22,4 +23,7 @@ (pp (digest-string "" 'sha-1 'hex)) ;; should give "a9993e364706816aba3e25717850c26c9cd0d89d" - (pp (digest-string "abc" 'sha-1 'hex))))) + (pp (digest-string "abc" 'sha-1 'hex))) + + (when z + (pp (addn 5 z))))) diff --git a/when-unless.scm b/when-unless.scm index 24780ba..f68b20e 100644 --- a/when-unless.scm +++ b/when-unless.scm @@ -7,9 +7,12 @@ (import (only (gambit) if not begin)) ;; required by expansions of when and unless - (export when unless) + (export when unless addn) (begin + (define-syntax addn + (macro args + `(##+ ,(car args) ,(cadr args)))) (define-syntax when (lambda (x)