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