66 lines
2.2 KiB
Scheme
66 lines
2.2 KiB
Scheme
|
|
(module kerncase mzscheme
|
|
|
|
(define-syntax kernel-syntax-case-internal
|
|
(lambda (stx)
|
|
(syntax-case stx ()
|
|
[(_ stxv trans? (extras ...) kernel-context clause ...)
|
|
(quasisyntax/loc
|
|
stx
|
|
(syntax-case* stxv #,(datum->syntax-object
|
|
#'kernel-context
|
|
(append (syntax->list #'(extras ...))
|
|
'(quote
|
|
quote-syntax #%datum #%top
|
|
lambda case-lambda
|
|
let-values letrec-values
|
|
begin begin0 set!
|
|
with-continuation-mark
|
|
if #%app #%expression
|
|
define-values define-syntaxes define-values-for-syntax
|
|
module #%plain-module-begin require provide
|
|
require-for-syntax require-for-template
|
|
#%variable-reference)))
|
|
(if trans? module-transformer-identifier=? module-identifier=?)
|
|
clause ...))])))
|
|
|
|
(define-syntax kernel-syntax-case
|
|
(lambda (stx)
|
|
(syntax-case stx ()
|
|
[(_ stxv trans? clause ...)
|
|
(quasisyntax/loc stx
|
|
(kernel-syntax-case-internal stxv trans? () #,stx clause ...))])))
|
|
|
|
(define-syntax kernel-syntax-case*
|
|
(lambda (stx)
|
|
(syntax-case stx ()
|
|
[(_ stxv trans? (extras ...) clause ...)
|
|
(quasisyntax/loc stx
|
|
(kernel-syntax-case-internal stxv trans? (extras ...) #,stx clause ...))])))
|
|
|
|
(define (kernel-form-identifier-list stx)
|
|
(map (lambda (s)
|
|
(datum->syntax-object stx s #f))
|
|
'(begin
|
|
define-values
|
|
define-syntaxes
|
|
define-values-for-syntax
|
|
set!
|
|
let-values
|
|
letrec-values
|
|
lambda
|
|
case-lambda
|
|
if
|
|
quote
|
|
letrec-syntaxes+values
|
|
with-continuation-mark
|
|
#%expression
|
|
#%app
|
|
#%top
|
|
#%datum
|
|
#%variable-reference)))
|
|
|
|
(provide kernel-syntax-case
|
|
kernel-syntax-case*
|
|
kernel-form-identifier-list))
|