parent
754211eead
commit
6a685f52c6
|
@ -6,20 +6,25 @@
|
|||
(#%require '#%paramz '#%unsafe "qq-and-or.rkt" "cond.rkt" "define.rkt" "fixnum.rkt"
|
||||
(for-syntax '#%kernel "define-et-al.rkt" "qq-and-or.rkt" "cond.rkt"
|
||||
"stxcase-scheme.rkt"
|
||||
"qqstx.rkt" "define.rkt" "sort.rkt" "fixnum.rkt"))
|
||||
"qqstx.rkt" "define.rkt" "sort.rkt" "fixnum.rkt"
|
||||
"stx.rkt"))
|
||||
(#%provide case)
|
||||
|
||||
(define-syntax (case stx)
|
||||
(syntax-case stx (else)
|
||||
(syntax-case stx ()
|
||||
;; Empty case
|
||||
[(_ v)
|
||||
(syntax-protect
|
||||
(syntax/loc stx (#%expression (begin v (void)))))]
|
||||
|
||||
;; Else-only case
|
||||
[(_ v [else e es ...])
|
||||
(syntax-protect
|
||||
(syntax/loc stx (#%expression (begin v (let-values () e es ...)))))]
|
||||
[(_ v [maybe-else e es ...])
|
||||
(and (identifier? #'maybe-else) (free-identifier=? #'else #'maybe-else))
|
||||
(syntax-property
|
||||
(syntax-protect
|
||||
(syntax/loc stx (#%expression (begin v (let-values () e es ...)))))
|
||||
'disappeared-use
|
||||
(list (syntax-local-introduce #'maybe-else)))]
|
||||
|
||||
;; If we have a syntactically correct form without an 'else' clause,
|
||||
;; add the default 'else' and try again.
|
||||
|
@ -28,13 +33,17 @@
|
|||
(syntax/loc stx (self v [(k ...) e1 e2 ...] ... [else (void)])))]
|
||||
|
||||
;; The general case
|
||||
[(_ v [(k ...) e1 e2 ...] ... [else x1 x2 ...])
|
||||
(syntax-protect
|
||||
(if (< (length (syntax-e #'(k ... ...))) *sequential-threshold*)
|
||||
(syntax/loc stx (let ([tmp v])
|
||||
(case/sequential tmp [(k ...) e1 e2 ...] ... [else x1 x2 ...])))
|
||||
(syntax/loc stx (let ([tmp v])
|
||||
(case/dispatch tmp [(k ...) e1 e2 ...] ... [else x1 x2 ...])))))]
|
||||
[(_ v [(k ...) e1 e2 ...] ... [maybe-else x1 x2 ...])
|
||||
(and (identifier? #'maybe-else) (free-identifier=? #'else #'maybe-else))
|
||||
(syntax-property
|
||||
(syntax-protect
|
||||
(if (< (length (syntax-e #'(k ... ...))) *sequential-threshold*)
|
||||
(syntax/loc stx (let ([tmp v])
|
||||
(case/sequential tmp [(k ...) e1 e2 ...] ... [else x1 x2 ...])))
|
||||
(syntax/loc stx (let ([tmp v])
|
||||
(case/dispatch tmp [(k ...) e1 e2 ...] ... [else x1 x2 ...])))))
|
||||
'disappeared-use
|
||||
(list (syntax-local-introduce #'maybe-else)))]
|
||||
|
||||
;; Error cases
|
||||
[(_ v clause ...)
|
||||
|
|
Loading…
Reference in New Issue
Block a user