home *** CD-ROM | disk | FTP | other *** search
- (define %compile compile)
-
- (define (%expand-macros expr)
- (if (pair? expr)
- (if (symbol? (car expr))
- (let ((expander (get (car expr) '%syntax)))
- (if expander
- (expander expr)
- (let ((expander (get (car expr) '%macro)))
- (if expander
- (%expand-macros (expander expr))
- (cons (car expr) (%expand-list (cdr expr)))))))
- (%expand-list expr))
- expr))
-
- (define (%expand-list lyst)
- (if (pair? lyst)
- (cons (%expand-macros (car lyst)) (%expand-list (cdr lyst)))
- lyst))
-
- (define (compile expr #!optional env)
- (if (default-object? env)
- (%compile (%expand-macros expr))
- (%compile (%expand-macros expr) env)))
-
- (put 'macro '%macro
- (lambda (form)
- (list 'put
- (list 'quote (cadr form))
- (list 'quote '%macro)
- (caddr form))))
-
- (macro syntax
- (lambda (form)
- (list 'put
- (list 'quote (cadr form))
- (list 'quote '%syntax)
- (caddr form))))
-
- (syntax quote
- (lambda (form) form))
-
- (syntax lambda
- (lambda (form)
- (cons
- 'lambda
- (cons
- (cadr form)
- (%expand-list (cddr form))))))
-
- (syntax define
- (lambda (form)
- (cons
- 'define
- (cons
- (cadr form)
- (%expand-list (cddr form))))))
-
- (syntax set!
- (lambda (form)
- (cons
- 'set!
- (cons
- (cadr form)
- (%expand-list (cddr form))))))
-
- (define (%cond-expander lyst)
- (cond
- ((pair? lyst)
- (cons
- (if (pair? (car lyst))
- (%expand-list (car lyst))
- (car lyst))
- (%cond-expander (cdr lyst))))
- (else lyst)))
-
- (syntax cond
- (lambda (form)
- (cons 'cond (%cond-expander (cdr form)))))
-
- (define (%let-expander lyst)
- (cond
- ((pair? lyst)
- (cons
- (car lyst)
- (%let-expander (cdr lyst))))
- (else lyst)))
-
- (syntax let
- (lambda (form)
- (cons
- 'let
- (cons
- (%let-expander (cadr form))
- (%expand-list (cddr form))))))
-
- (syntax let*
- (lambda (form)
- (cons
- 'let*
- (cons
- (%let-expander (cadr form))
- (%expand-list (cddr form))))))
-
- (syntax letrec
- (lambda (form)
- (cons
- 'letrec
- (cons
- (%let-expander (cadr form))
- (%expand-list (cddr form))))))
-
- (macro define-integrable
- (lambda (form)
- (cons 'define (cdr form))))
-
- (macro declare
- (lambda (form) #f))