[r6rs-discuss] Comments on syntax-rules

From: Abdulaziz Ghuloum <aghuloum>
Date: Sun Nov 19 15:18:01 2006

On Nov 19, 2006, at 1:23 PM, Michael Sperber wrote:

> Also, many people (like myself) regard `syntax-rules' as simpler to
> use,
> and have trouble dealing with `syntax-case'. We don't want to require
> them to understand the much more complicated specification of
> `syntax-case' just to be able to use `syntax-rules'.

Here is an excerpt from http://srfi.schemers.org/srfi-86/srfi-86.txt
demonstrating the "simplicity" of syntax-rules. The SRFI contains some
1200 lines of syntax-rules beauty, scalability, and power. Another
SRFI of interest is http://srfi.schemers.org/srfi-92/srfi-92.txt with
another 1500 lines of syntax-rules.

Many people (like myself) regard `syntax-case' as a powerful macro
system that allows them to do exactly what they want; including defining
simpler macro systems. Syntax-rules is harder to use for anything more
complex than let, and, or, and friends. Even letrec, cond, case, and
friends are simpler in syntax-case.

Aziz,,,

(define-syntax %alet
   (syntax-rules (opt cat key rec and values)
     ((%alet () ((n v) ...) () bd ...)
      ((lambda (n ...) bd ...) v ...))
     ((%alet (var) ((n v) ...) () bd ...)
      ((letrec ((var (lambda (n ...) bd ...)))
        var) v ...))
     ((%alet (var (p ...) (nv ...) (bn ...)) ((n v) ...) () bd ...)
      ((letrec ((t (lambda (v ...)
                    (%alet (p ...) (nv ... (n v) ... (var t))
                           (bn ...) bd ...))))
        t) v ...))
     ((%alet (p ...) (nv ...) ((() a b ...) bn ...) bd ...)
      ((lambda () a b ... (%alet (p ...) (nv ...) (bn ...) bd ...))))
     ((%alet (p ...) (nv ...) (((a) c) bn ...) bd ...)
      ((lambda (t) (%alet (p ...) (nv ... (a t)) (bn ...) bd ...)) c))

     ((%alet (p ...) (nv ...) (((values a) c) bn ...) bd ...)
      ((lambda (t) (%alet (p ...) (nv ... (a t)) (bn ...) bd ...)) c))
     ((%alet (p ...) (nv ...) (((values . b) c d ...) bn ...) bd ...)
      (%alet "dot" (p ...) (nv ...) (values) (b c d ...) (bn ...) bd
...))
     ((%alet "dot" (p ...) (nv ...) (values t ...) ((a . b) c ...)
            (bn ...) bd ...)
      (%alet "dot" (p ...) (nv ... (a tn)) (values t ... tn) (b c ...)
            (bn ...) bd ...))
     ((%alet "dot" (p ...) (nv ...) (values t ...) (() c) (bn ...) bd
...)
      (call-with-values (lambda () c)
        (lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...))))
     ((%alet "dot" (p ...) (nv ...) (values t ...) (() c ...) (bn ...)
bd ...)
      ((lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...)) c ...))
     ((%alet "dot" (p ...) (nv ...) (values t ...) (b c) (bn ...) bd ...)
      (call-with-values (lambda () c)
        (lambda (t ... . tn)
         (%alet (p ...) (nv ... (b tn)) (bn ...) bd ...))))
     ((%alet "dot" (p ...) (nv ...) (values t ...) (b c ...) (bn ...) bd
...)
      ((lambda (t ... . tn)
        (%alet (p ...) (nv ... (b tn)) (bn ...) bd ...)) c ...))

     ((%alet (p ...) (nv ...) (((a . b) c d ...) bn ...) bd ...)
      (%alet "dot" (p ...) (nv ... (a t)) (t) (b c d ...) (bn ...) bd
...))
     ((%alet "dot" (p ...) (nv ...) (t ...) ((a . b) c ...) (bn ...) bd
...)
      (%alet "dot" (p ...) (nv ... (a tn)) (t ... tn) (b c ...) (bn ...)
            bd ...))
     ((%alet "dot" (p ...) (nv ...) (t ...) (() c) (bn ...) bd ...)
      (c (lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...))))
     ((%alet "dot" (p ...) (nv ...) (t ...) (() c ...) (bn ...) bd ...)
      ((lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...)) c ...))
     ((%alet "dot" (p ...) (nv ...) (t ...) (b c) (bn ...) bd ...)
      (c (lambda (t ... . tn) (%alet (p ...) (nv ... (b tn)) (bn ...) bd
...))))
     ((%alet "dot" (p ...) (nv ...) (t ...) (b c ...) (bn ...) bd ...)
      ((lambda (t ... . tn)
        (%alet (p ...) (nv ... (b tn)) (bn ...) bd ...)) c ...))

     ((%alet (p ...) (nv ...) ((and (n1 v1 t1 ...) (n2 v2 t2 ...) ...)
bn ...)
            bd ...)
      (%alet "and" (p ...) (nv ...) ((n1 v1 t1 ...) (n2 v2 t2 ...) ...)
(bn ...)
            bd ...))
     ((%alet "and" (p ...) (nv ...) ((n v) nvt ...) (bn ...) bd ...)
      (let ((t v))
        (and t (%alet "and" (p ...) (nv ... (n t)) (nvt ...) (bn ...) bd
...))))
     ((%alet "and" (p ...) (nv ...) ((n v t) nvt ...) (bn ...) bd ...)
      (let ((tt v))
        (and (let ((n tt)) t)
            (%alet "and" (p ...) (nv ... (n tt)) (nvt ...) (bn ...) bd ...))))
     ((%alet "and" (p ...) (nv ...) () (bn ...) bd ...)
      (%alet (p ...) (nv ...) (bn ...) bd ...))
     ((%alet (p ...) (nv ...) ((opt z a . e) bn ...) bd ...)
      (%alet "opt" (p ...) (nv ...) z (a . e) (bn ...) bd ...))
     ((%alet "opt" (p ...) (nv ...) z ((n d t ...)) (bn ...) bd ...)
      (let ((x (if (null? z)
                  d
                  (if (null? (cdr z))
                      (wow-opt n (car z) t ...)
                      (error "alet: too many arguments" (cdr z))))))
        (%alet (p ...) (nv ... (n x)) (bn ...) bd ...)))
     ((%alet "opt" (p ...) (nv ...) z ((n d t ...) . e) (bn ...) bd ...)
      (let ((y (if (null? z) z (cdr z)))
           (x (if (null? z)
                  d
                  (wow-opt n (car z) t ...))))
        (%alet "opt" (p ...) (nv ... (n x)) y e (bn ...) bd ...)))
     ((%alet "opt" (p ...) (nv ...) z e (bn ...) bd ...)
      (let ((te z))
        (%alet (p ...) (nv ... (e te)) (bn ...) bd ...)))
     ((%alet (p ...) (nv ...) ((cat z a . e) bn ...) bd ...)
      (let ((y z))
        (%alet "cat" (p ...) (nv ...) y (a . e) (bn ...) bd ...)))
     ((%alet "cat" (p ...) (nv ...) z ((n d t ...)) (bn ...) bd ...)
      (let ((x (if (null? z)
                  d
                  (if (null? (cdr z))
                      (wow-cat-end z n t ...)
                      (error "alet: too many arguments" (cdr z))))))
        (%alet (p ...) (nv ... (n x)) (bn ...) bd ...)))
     ((%alet "cat" (p ...) (nv ...) z ((n d t ...) . e) (bn ...) bd ...)
      (let ((x (if (null? z)
                  d
                  (wow-cat! z n d t ...))))
        (%alet "cat" (p ...) (nv ... (n x)) z e (bn ...) bd ...)))
     ((%alet "cat" (p ...) (nv ...) z e (bn ...) bd ...)
      (let ((te z))
        (%alet (p ...) (nv ... (e te)) (bn ...) bd ...)))
     ((%alet (p ...) (nv ...) ((key z a . e) bn ...) bd ...)
      (let ((y z))
        (%alet "key" (p ...) (nv ...) y () () (a . e) () (bn ...) bd
...)))
     ((%alet "key" (p ...) (nv ...) z ()
            (ndt ...) (((n k) d t ...) . e) (kk ...) (bn ...) bd ...)
      (%alet "key" (p ...) (nv ...) z ()
            (ndt ... ((n k) d t ...)) e (kk ... k) (bn ...) bd ...))
     ((%alet "key" (p ...) (nv ...) z ()
            (ndt ...) ((n d t ...) . e) (kk ...) (bn ...) bd ...)
      (%alet "key" (p ...) (nv ...) z ()
            (ndt ... ((n 'n) d t ...)) e (kk ... 'n) (bn ...) bd ...))
     ((%alet "key" (p ...) (nv ...) z ()
            (ndt nd ...) (#t . e) (kk k ...) (bn ...) bd ...)
      (%alet "key" (p ...) (nv ...) z (#t)
            (ndt nd ...) e (kk k ...) (bn ...) bd ...))
     ((%alet "key" (p ...) (nv ...) z ()
            (ndt nd ...) (#f . e) (kk k ...) (bn ...) bd ...)
      (%alet "key" (p ...) (nv ...) z (#f)
            (ndt nd ...) e (kk k ...) (bn ...) bd ...))
     ((%alet "key" (p ...) (nv ...) z (o ...)
            (((n k) d t ...) ndt ...) e (kk ...) (bn ...) bd ...)
      (let ((x (if (null? z)
                  d
                  (wow-key! z (o ...) (kk ...) (n k) d t ...))))
        (%alet "key" (p ...) (nv ... (n x)) z (o ...)
              (ndt ...) e (kk ...) (bn ...) bd ...)))
     ((%alet "key" (p ...) (nv ...) z (o ...) () () (kk ...) (bn ...) bd
...)
      (if (null? z)
         (%alet (p ...) (nv ...) (bn ...) bd ...)
         (error "alet: too many arguments" z)))
     ((%alet "key" (p ...) (nv ...) z (o ...) () e (kk ...) (bn ...) bd
...)
      (let ((te z)) (%alet (p ...) (nv ... (e te)) (bn ...) bd ...)))
     ((%alet (p ...) (nv ...) ((rec (n v) (nn vv) ...) bn ...) bd ...)
      (%alet "rec" (p ...) (nv ... (n t)) ((n v t))
            ((nn vv) ...) (bn ...) bd ...))
     ((%alet "rec" (p ...) (nv ...) (nvt ...) ((n v) (nn vv) ...)
            (bn ...) bd ...)
      (%alet "rec" (p ...) (nv ... (n t)) (nvt ... (n v t)) ((nn vv) ...)
            (bn ...) bd ...))
     ((%alet "rec" (p ...) (nv ...) ((n v t) ...) () (bn ...) bd ...)
      ((let ((n '<undefined>) ...)
        (let ((t v) ...)
          (set! n t) ...
          (mu n ...)))
       (lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...))))

     ((%alet (p ...) (nv ...) ((a b) bn ...) bd ...)
      ((lambda (t) (%alet (p ...) (nv ... (a t)) (bn ...) bd ...)) b))

     ((%alet (p ...) (nv ...) ((values a c) bn ...) bd ...)
      ((lambda (t) (%alet (p ...) (nv ... (a t)) (bn ...) bd ...)) c))
     ((%alet (p ...) (nv ...) ((values a b c ...) bn ...) bd ...)
      (%alet "not" (p ...) (nv ... (a t)) (values t) (b c ...) (bn ...)
bd ...))
     ((%alet "not" (p ...) (nv ...) (values t ...) (a b c ...) (bn ...)
bd ...)
      (%alet "not" (p ...) (nv ... (a tn)) (values t ... tn) (b c ...)
            (bn ...) bd ...))
     ((%alet "not" (p ...) (nv ...) (values t ...) (z) (bn ...) bd ...)
      (call-with-values (lambda () z)
        (lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...))))

     ((%alet (p ...) (nv ...) ((a b c ...) bn ...) bd ...)
      (%alet "not" (p ...) (nv ... (a t)) (t) (b c ...) (bn ...) bd ...))
     ((%alet "not" (p ...) (nv ...) (t ...) (a b c ...) (bn ...) bd ...)
      (%alet "not" (p ...) (nv ... (a tn)) (t ... tn) (b c ...) (bn ...)
            bd ...))
     ((%alet "not" (p ...) (nv ...) (t ...) (z) (bn ...) bd ...)
      (z (lambda (t ...) (%alet (p ...) (nv ...) (bn ...) bd ...))))
     ((%alet (p ...) (nv ...) ((a) bn ...) bd ...)
      (call-with-current-continuation
       (lambda (t) (%alet (p ...) (nv ... (a t)) (bn ...) bd ...))))
     ((%alet (p ...) (nv ...) ((a . b) bn ...) bd ...)
      (%alet "rot" (p ...) (nv ...) (a) b (bn ...) bd ...))
     ((%alet "rot" (p ...) (nv ...) (new-bn ...) (a . b) (bn ...) bd ...)
      (%alet "rot" (p ...) (nv ...) (new-bn ... a) b (bn ...) bd ...))
     ((%alet "rot" (p ...) (nv ...) (()) b (bn ...) bd ...)
      (%alet (b (p ...) (nv ...) (bn ...)) () () bd ...))
     ((%alet "rot" (p ...) (nv ...) (new-bn ...) b (bn ...) bd ...)
      (%alet (b (p ...) (nv ...) (bn ...)) () (new-bn ...) bd ...))
     ((%alet (p ...) (nv ...) (a b bn ...) bd ...)
      (b (lambda t (%alet (p ...) (nv ... (a t)) (bn ...) bd ...))))))
Received on Sun Nov 19 2006 - 15:17:37 UTC

This archive was generated by hypermail 2.3.0 : Wed Oct 23 2024 - 09:15:00 UTC