home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
213a.lha
/
Scheme
/
Tutorial
/
MACROS.S
< prev
next >
Wrap
Text File
|
1996-02-14
|
3KB
|
119 lines
(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))