summaryrefslogtreecommitdiff
path: root/scheme/sweet-macros/helper1.mzscheme.sls
blob: 06f52f58cda22010cbb7be90eb6d85eb51747b77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!r6rs
(library (sweet-macros helper1)
(export local guarded-syntax-case)
(import (rnrs))

(define-syntax local
  (lambda (x)
    (syntax-case x (syntax-match)
      ((local expr)
       #'expr)
      ((local (let-form name value) ... (syntax-match b0 b1 b2 ...))
       #'(syntax-match (local (let-form name value) ...) b0 b1 b2 ...))
      ((local (let-form name value) (l n v) ... expr)
       #'(let-form ((name value)) (local (l n v) ... expr))))
    ))

(define-syntax guarded-syntax-case
  (let ((add-clause
         (lambda (clause acc)
           (syntax-case clause ()
             ((pattern skeleton . rest)
                (syntax-case #'rest ()
                  ((cond? else1 else2 ...)
                   (cons*
                    #'(pattern cond? skeleton)
                    #'(pattern (begin else1 else2 ...))
                    acc))
                  ((cond?)
                   (cons #'(pattern cond? skeleton) acc))
                  (()
                   (cons #'(pattern skeleton) acc))
                  ))))))
    (lambda (x)
      (syntax-case x ()
        ((guarded-syntax-case () (literal ...) clause ...)
         #'(lambda (y) (guarded-syntax-case y (literal ...) clause ...)))
        ((guarded-syntax-case y (literal ...) clause ...)
         (with-syntax
             (((c ...) (fold-right add-clause '() #'(clause ...))))
           #'(syntax-case y (literal ...) c ...)))
        ))))
)