Added a chezscheme (almoste r6rs) version
3 files changed, 164 insertions(+), 150 deletions(-)

A => syntax/define-impl.scm
A => syntax/define.chezscheme.sls
M syntax/define.scm
A => syntax/define-impl.scm +148 -0
@@ 0,0 1,148 @@ 
+
+(define-syntax new-lambda
+  (syntax-rules ()
+    ((_ formals body body* ...)
+     (lambda formals (parse-body (lambda formals body body* ...) body body* ...)))))
+
+(define-syntax new-define
+  (syntax-rules ()
+    ((_ (stuff ...) body body* ...)
+     (define (stuff ...) (parse-body (define (stuff ...) body body* ...) body body* ...)))
+    ((_ name expr) (define name expr))))
+
+
+
+(define-syntax new-let
+  (syntax-rules ()
+    ((_ (clauses ...) body body* ...)
+     (let (clauses ...) (parse-body (let (clauses ...) body body* ...) body body* ...)))
+    ((_ name (clauses ...) body body* ...)
+     (let name (clauses ...)
+       (parse-body (let name (clauses ...) body body* ...) body body* ...)))
+    ((_ err ...) (syntax-error "Bad let form"))))
+
+(define-syntax new-let*
+  (syntax-rules ()
+    ((_ (clauses ...) body body* ...)
+     (let* (clauses ...) (parse-body (let (clauses ...) body body* ...) body body* ...)))
+    ((_ err ...) (syntax-error "Bad let* form"))))
+
+(define-syntax new-letrec
+  (syntax-rules ()
+    ((_ clauses body body* ...)
+     (letrec clauses
+       (parse-body (letrec clauses body body* ...) body body* ...)))
+    ((_ err ...) (syntax-error "Bad letrec form"))))
+
+(define-syntax new-letrec*
+  (syntax-rules ()
+    ((_ clauses body body* ...)
+     (letrec* clauses
+       (parse-body (letrec* clauses body body* ...) body body* ...)))
+    ((_ err ...) (syntax-error "Bad letrec* form"))))
+
+(define-syntax new-case
+  (syntax-rules ()
+    ((_ key clauses ...)
+     (nca (case clauses ...) key () clauses ...))
+    ((_ err ...) (syntax-error "Bad case form"))))
+
+(define-syntax new-when
+  (syntax-rules ()
+    ((_ test body body* ...)
+     (when test (parse-body (when test body body* ...) body body* ...)))
+    ((err ...) (syntax-error "Bad when form"))))
+
+(define-syntax new-unless
+  (syntax-rules ()
+    ((_ test body body* ...)
+     (unless test (parse-body (unless test body body* ...) body body* ...)))
+    ((err ...) (syntax-error "Bad unless form"))))
+
+
+
+(define-syntax nca
+  (syntax-rules (else =>)
+    ((_ o k (clauses ...))
+     (case k clauses ...))
+    ((_ o k (c ...) (else => expr))
+     (nca o k (c ... (else => expr))))
+    ;; error checking the else clause:
+    ((_ o k c (else => expr ...) more ...)
+     (syntax-error "Malformed else clause" o))
+
+    ((_ o k (c ...) (d => expr) . rest)
+     (nca o k (c ... (d => expr)) . rest))
+    ;; error checking the lambda clause
+    ((_ o k c (d => expr ...) . rest)
+     (syntax-error "Malformed case clause in form " (d => expr ...) o))
+    ((_ o k (c ...) (d expr exprs ...) . rest)
+     (nca o k (c ... (d (parse-body o expr exprs ...))) . rest))
+    ((_ o  stuff ...) (syntax-error "Error in form " o))
+    ((_ o err ...) (syntax-error "Bad case form" o))))
+
+
+
+;; Exploits the fact that cond is just transformed into an if.
+;; This means we can, as with case, just re-use guile's own
+;; cond. Guile supports a non-standard guard-case. This should be removed
+;; if porting to any other scheme.
+(define-syntax new-cond
+  (syntax-rules ()
+    ((_ clauses ...)
+     (nc (cond clauses ...) () clauses ...))))
+
+(define-syntax nc
+  (syntax-rules (else =>)
+    ((nc o (clauses ...))
+     (cond clauses ...))
+    ((nc o (c ...) (else body ...))
+     (nc o (c ... (else (parse-body o body ...)))))
+    ((nc o (c ...) (test => expr) . rest)
+     (nc o (c ... (test => expr)) . rest))
+    ((nc o c (test => expr ...) . rest)
+     (syntax-error "Bad cond clause form " (test => expr ...) o))
+    ;; Remove these 2 clauses if porting to a scheme without this form
+    ((nc o (c ...) (test guard => expr) . rest)
+     (nc o (c ... (test guard => expr)) . rest))
+    ((nc o c (test guard => expr ...) . rest)
+     (syntax-error "Bad cond clause form " (test guard => expr ...) o))
+
+
+    ((nc o (c ...) (test body body* ...) . rest)
+     (nc o (c ... (test (parse-body o body body* ...))) . rest))
+
+    ;; Error clauses
+    ((nc o (c ...) (else body ...) error-clause error-clause* ...)
+     (syntax-error "Else must be the last clause of a cond in form " o))
+    ((_ o err ...) (syntax-error "Bad cond form" o))))
+
+
+
+(define-syntax parse-body
+  (syntax-rules (new-define)
+    ((_ orig stuff ... (new-define stuff2 ...))
+     (syntax-error "Body should end with an expression in form " orig))
+    ((_ orig body ...)
+     (pb2 orig () () body ...))))
+
+(define-syntax pb2
+  (syntax-rules (new-define)
+    ((pb2 orig () (expr ...) expr*)
+     (begin expr ... expr*))
+    ((pb2 orig (clauses ...) (expr ...) expr*)
+     (letrec* (clauses ...) expr ... expr*))
+
+
+    ((pb2 orig (clauses ...) () (new-define (name args ...) body ...) . rest)
+     (pb2 orig (clauses ... (name (new-lambda (args ...) body ...))) () . rest))
+    ((pb2 o (clauses ...) () (new-define var body ...) . rest)
+     (pb2 o (clauses ... (var (begin body ...))) () . rest))
+
+    ((pb2 orig (clauses ...) (expr ...) (new-define (name args ...) body ...) . rest)
+     (pb2 orig (clauses ... (_ (begin expr ...)) (name (new-lambda (args ...) body ...))) () . rest))
+    ((pb2 o (clauses ...) (expr ...) (new-define var body ...) . rest)
+     (pb2 o (clauses ... (_ (begin expr ...)) (var (begin body ...))) () . rest))
+
+    ((pb2 o (clauses ...) (expr ...) expr* . rest)
+     (pb2 o (clauses ...) (expr ... expr*) . rest))))

          
A => syntax/define.chezscheme.sls +15 -0
@@ 0,0 1,15 @@ 
+(library (syntax define)
+  (export (rename (new-define define)
+                  (new-lambda lambda)
+                  (new-define define)
+                  (new-let let)
+                  (new-let* let*)
+                  (new-letrec letrec)
+                  (new-letrec* letrec*)
+                  (new-when when)
+                  (new-unless unless)
+                  (new-case case)
+                  (new-cond cond)))
+  (import (chezscheme))
+  (include "define-impl.scm")
+  )

          
M syntax/define.scm +1 -150
@@ 23,153 23,4 @@ 
              (new-unless . unless)
              (new-case . case)
              (new-cond . cond)))
-
-
-
-(define-syntax new-lambda
-  (syntax-rules ()
-    ((_ formals body body* ...)
-     (lambda formals (parse-body (lambda formals body body* ...) body body* ...)))))
-
-(define-syntax new-define
-  (syntax-rules ()
-    ((_ (stuff ...) body body* ...)
-     (define (stuff ...) (parse-body (define (stuff ...) body body* ...) body body* ...)))
-    ((_ name expr) (define name expr))))
-
-
-
-(define-syntax new-let
-  (syntax-rules ()
-    ((_ (clauses ...) body body* ...)
-     (let (clauses ...) (parse-body (let (clauses ...) body body* ...) body body* ...)))
-    ((_ name (clauses ...) body body* ...)
-     (let name (clauses ...)
-       (parse-body (let name (clauses ...) body body* ...) body body* ...)))
-    ((_ err ...) (syntax-error "Bad let form"))))
-
-(define-syntax new-let*
-  (syntax-rules ()
-    ((_ (clauses ...) body body* ...)
-     (let* (clauses ...) (parse-body (let (clauses ...) body body* ...) body body* ...)))
-    ((_ err ...) (syntax-error "Bad let* form"))))
-
-(define-syntax new-letrec
-  (syntax-rules ()
-    ((_ clauses body body* ...)
-     (letrec clauses
-       (parse-body (letrec clauses body body* ...) body body* ...)))
-    ((_ err ...) (syntax-error "Bad letrec form"))))
-
-(define-syntax new-letrec*
-  (syntax-rules ()
-    ((_ clauses body body* ...)
-     (letrec* clauses
-       (parse-body (letrec* clauses body body* ...) body body* ...)))
-    ((_ err ...) (syntax-error "Bad letrec* form"))))
-
-(define-syntax new-case
-  (syntax-rules ()
-    ((_ key clauses ...)
-     (nca (case clauses ...) key () clauses ...))
-    ((_ err ...) (syntax-error "Bad case form"))))
-
-(define-syntax new-when
-  (syntax-rules ()
-    ((_ test body body* ...)
-     (when test (parse-body (when test body body* ...) body body* ...)))
-    ((err ...) (syntax-error "Bad when form"))))
-
-(define-syntax new-unless
-  (syntax-rules ()
-    ((_ test body body* ...)
-     (unless test (parse-body (unless test body body* ...) body body* ...)))
-    ((err ...) (syntax-error "Bad unless form"))))
-
-
-
-(define-syntax nca
-  (syntax-rules (else =>)
-    ((_ o k (clauses ...))
-     (case k clauses ...))
-    ((_ o k (c ...) (else => expr))
-     (nca o k (c ... (else => expr))))
-    ;; error checking the else clause:
-    ((_ o k c (else => expr ...) more ...)
-     (syntax-error "Malformed else clause" o))
-
-    ((_ o k (c ...) (d => expr) . rest)
-     (nca o k (c ... (d => expr)) . rest))
-    ;; error checking the lambda clause
-    ((_ o k c (d => expr ...) . rest)
-     (syntax-error "Malformed case clause in form " (d => expr ...) o))
-    ((_ o k (c ...) (d expr exprs ...) . rest)
-     (nca o k (c ... (d (parse-body o expr exprs ...))) . rest))
-    ((_ o  stuff ...) (syntax-error "Error in form " o))
-    ((_ o err ...) (syntax-error "Bad case form" o))))
-
-
-
-;; Exploits the fact that cond is just transformed into an if.
-;; This means we can, as with case, just re-use guile's own
-;; cond. Guile supports a non-standard guard-case. This should be removed
-;; if porting to any other scheme.
-(define-syntax new-cond
-  (syntax-rules ()
-    ((_ clauses ...)
-     (nc (cond clauses ...) () clauses ...))))
-
-(define-syntax nc
-  (syntax-rules (else =>)
-    ((nc o (clauses ...))
-     (cond clauses ...))
-    ((nc o (c ...) (else body ...))
-     (nc o (c ... (else (parse-body o body ...)))))
-    ((nc o (c ...) (test => expr) . rest)
-     (nc o (c ... (test => expr)) . rest))
-    ((nc o c (test => expr ...) . rest)
-     (syntax-error "Bad cond clause form " (test => expr ...) o))
-    ;; Remove these 2 clauses if porting to a scheme without this form
-    ((nc o (c ...) (test guard => expr) . rest)
-     (nc o (c ... (test guard => expr)) . rest))
-    ((nc o c (test guard => expr ...) . rest)
-     (syntax-error "Bad cond clause form " (test guard => expr ...) o))
-
-
-    ((nc o (c ...) (test body body* ...) . rest)
-     (nc o (c ... (test (parse-body o body body* ...))) . rest))
-
-    ;; Error clauses
-    ((nc o (c ...) (else body ...) error-clause error-clause* ...)
-     (syntax-error "Else must be the last clause of a cond in form " o))
-    ((_ o err ...) (syntax-error "Bad cond form" o))))
-
-
-
-(define-syntax parse-body
-  (syntax-rules (new-define)
-    ((_ orig stuff ... (new-define stuff2 ...))
-     (syntax-error "Body should end with an expression in form " orig))
-    ((_ orig body ...)
-     (pb2 orig () () body ...))))
-
-(define-syntax pb2
-  (syntax-rules (new-define)
-    ((pb2 orig () (expr ...) expr*)
-     (begin expr ... expr*))
-    ((pb2 orig (clauses ...) (expr ...) expr*)
-     (letrec* (clauses ...) expr ... expr*))
-
-
-    ((pb2 orig (clauses ...) () (new-define (name args ...) body ...) . rest)
-     (pb2 orig (clauses ... (name (new-lambda (args ...) body ...))) () . rest))
-    ((pb2 o (clauses ...) () (new-define var body ...) . rest)
-     (pb2 o (clauses ... (var (begin body ...))) () . rest))
-
-    ((pb2 orig (clauses ...) (expr ...) (new-define (name args ...) body ...) . rest)
-     (pb2 orig (clauses ... (_ (begin expr ...)) (name (new-lambda (args ...) body ...))) () . rest))
-    ((pb2 o (clauses ...) (expr ...) (new-define var body ...) . rest)
-     (pb2 o (clauses ... (_ (begin expr ...)) (var (begin body ...))) () . rest))
-
-    ((pb2 o (clauses ...) (expr ...) expr* . rest)
-     (pb2 o (clauses ...) (expr ... expr*) . rest))))
+(include "define-impl.scm")