.
original commit: ed3c16a5375d0e52b313402cdf056d84225541bd
This commit is contained in:
parent
a981dc23b6
commit
c1cd82d152
|
@ -20,7 +20,8 @@
|
|||
rec
|
||||
evcase
|
||||
nor
|
||||
nand)
|
||||
nand
|
||||
let+)
|
||||
|
||||
(define true #t)
|
||||
(define false #f)
|
||||
|
@ -310,4 +311,56 @@
|
|||
[(_ expr ...)
|
||||
(syntax/loc stx (not (and expr ...)))])))
|
||||
|
||||
)
|
||||
(define-syntax let+
|
||||
(lambda (stx)
|
||||
(syntax-case stx ()
|
||||
[(_ [clause ...] body1 body ...)
|
||||
(let ([clauses (syntax->list (syntax (clause ...)))]
|
||||
[bad (lambda (c n)
|
||||
(raise-syntax-error
|
||||
'let+
|
||||
(format "illegal use of ~a for a clause" n)
|
||||
stx
|
||||
c))])
|
||||
;; syntax checks
|
||||
(for-each
|
||||
(lambda (clause)
|
||||
(syntax-case clause (val rec vals recs _)
|
||||
[(val var expr)
|
||||
(identifier? (syntax var))
|
||||
'ok]
|
||||
[(rec var expr)
|
||||
(identifier? (syntax var))
|
||||
'ok]
|
||||
[(vals (var expr) ...)
|
||||
(andmap identifier? (syntax->list (syntax (var ...))))
|
||||
'ok]
|
||||
[(recs (var expr) ...)
|
||||
(andmap identifier? (syntax->list (syntax (var ...))))
|
||||
'ok]
|
||||
[(_ expr)
|
||||
'ok]
|
||||
[(val . _) (bad clause "val")]
|
||||
[(rec . _) (bad clause "rec")]
|
||||
[(vals . _) (bad clause "vals")]
|
||||
[(recs . _) (bad clause"recs")]
|
||||
[(_ . _) (bad clause "_")]
|
||||
[_else (raise-syntax-error 'let+ "bad clause" stx clause)]))
|
||||
clauses)
|
||||
;; result
|
||||
(let loop ([clauses clauses])
|
||||
(if (null? clauses)
|
||||
(syntax (let () body1 body ...))
|
||||
(with-syntax ([rest (loop (cdr clauses))])
|
||||
(syntax-case (car clauses) (val rec vals recs _)
|
||||
[(val var expr)
|
||||
(syntax (let ([var expr]) rest))]
|
||||
[(rec var expr)
|
||||
(syntax (letrec ([var expr]) rest))]
|
||||
[(vals (var expr) ...)
|
||||
(syntax (let ([var expr] ...) rest))]
|
||||
[(recs (var expr) ...)
|
||||
(syntax (letrec ([var expr] ...) rest))]
|
||||
[(_ expr)
|
||||
(syntax (begin expr rest))])))))]))))
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user