Relocated case to scheme/base

This commit is contained in:
Justin Ethier 2015-08-20 21:31:36 -04:00
parent 6b6585b7e7
commit a228027ac4
2 changed files with 29 additions and 27 deletions

View file

@ -87,6 +87,7 @@
let let
let* let*
begin begin
case
cond cond
when when
quasiquote quasiquote
@ -193,6 +194,34 @@
(cons (rename 'begin) (cdr cl)) (cons (rename 'begin) (cdr cl))
(cons (rename 'cond) (cddr expr)))))) (cons (rename 'cond) (cddr expr))))))
(cadr expr)))))) (cadr expr))))))
(define-syntax case
(er-macro-transformer
(lambda (expr rename compare)
(define (body exprs)
(cond
((null? exprs)
(rename 'tmp))
((compare (rename '=>) (car exprs))
`(,(cadr exprs) ,(rename 'tmp)))
(else
`(,(rename 'begin) ,@exprs))))
(define (clause ls)
(cond
((null? ls) #f)
((compare (rename 'else) (caar ls))
(body (cdar ls)))
((and (pair? (car (car ls))) (null? (cdr (car (car ls)))))
`(,(rename 'if) (,(rename 'eqv?) ,(rename 'tmp)
(,(rename 'quote) ,(car (caar ls))))
,(body (cdar ls))
,(clause (cdr ls))))
(else
`(,(rename 'if) (,(rename 'memv) ,(rename 'tmp)
(,(rename 'quote) ,(caar ls)))
,(body (cdar ls))
,(clause (cdr ls))))))
`(let ((,(rename 'tmp) ,(cadr expr)))
,(clause (cddr expr))))))
(define-syntax when (define-syntax when
(er-macro-transformer (er-macro-transformer
(lambda (exp rename compare) (lambda (exp rename compare)

View file

@ -139,33 +139,6 @@
(define *defined-macros* (define *defined-macros*
(list (list
(cons 'letrec (lambda (exp rename compare) (letrec=>lets+sets exp))) (cons 'letrec (lambda (exp rename compare) (letrec=>lets+sets exp)))
(cons 'case
(lambda (expr rename compare)
(define (body exprs)
(cond
((null? exprs)
(rename 'tmp))
((compare (rename '=>) (car exprs))
`(,(cadr exprs) ,(rename 'tmp)))
(else
`(,(rename 'begin) ,@exprs))))
(define (clause ls)
(cond
((null? ls) #f)
((compare (rename 'else) (caar ls))
(body (cdar ls)))
((and (pair? (car (car ls))) (null? (cdr (car (car ls)))))
`(,(rename 'if) (,(rename 'eqv?) ,(rename 'tmp)
(,(rename 'quote) ,(car (caar ls))))
,(body (cdar ls))
,(clause (cdr ls))))
(else
`(,(rename 'if) (,(rename 'memv) ,(rename 'tmp)
(,(rename 'quote) ,(caar ls)))
,(body (cdar ls))
,(clause (cdr ls))))))
`(let ((,(rename 'tmp) ,(cadr expr)))
,(clause (cddr expr)))))
(cons 'cond-expand (cons 'cond-expand
;; Based on the cond-expand macro from Chibi scheme ;; Based on the cond-expand macro from Chibi scheme
(lambda (expr rename compare) (lambda (expr rename compare)