home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-386-Vol-2of3.iso
/
c
/
cr-macro.zip
/
USUAL.SCM
< prev
next >
Wrap
Text File
|
1990-02-22
|
3KB
|
127 lines
; The usual macros
(define usual
(make-mutable-environment (make-transformer-environment)))
(define-special-operators! usual)
(set! test-environment usual)
(for-each (lambda (form)
(environment-define!
usual
(define-syntax-name form)
(process-syntax-binding (define-syntax-rhs form)
usual)))
'(
(define-syntax define
(syntax-rules ()
((define (name . rest) body +)
(%define name (lambda rest body +)))
((define name rhs)
(%define name rhs))))
(define-syntax let
(syntax-rules ()
((let ((name val) *) body +)
((lambda (name *) body +) val *))
((let tag ((name val) *) body +)
((letrec ((tag (lambda (name *) body +)))
tag)
val *))))
(define-syntax let*
(syntax-rules ()
((let* () body +)
(let () body +))
((let* ((name1 val1) (name val) *) body +)
(let ((name1 val1)) (let* ((name val) *) body +)))))
(define-syntax and
(syntax-rules ()
((and) #t)
((and e) e)
((and e1 e +) (if e1 (and e +) #f))))
(define-syntax or
(syntax-rules ()
((or) #f)
((or e) e)
((or e1 e +) (let ((temp e1))
(if temp temp (or e +))))))
(define-syntax cond
(syntax-rules (else =>)
((cond (else result +)) (begin result +))
((cond (test => result))
(let ((temp test))
(if temp (result temp))))
((cond (test)) test)
((cond (test result +)) (if test (begin result +)))
((cond (test => result) clause +)
(let ((temp test))
(if temp (result temp) (cond clause +))))
((cond (test) clause +)
(or test (cond clause +)))
((cond (test result +)
clause +)
(if test
(begin result +)
(cond clause +)))))
(define-syntax do
(syntax-rules ()
((do ((name init step) *)
clause
body *)
(letrec ((loop (lambda (name *)
(cond clause
(else
(begin body *)
(loop step *))))))
(loop init *)))))
(define-syntax delay
(syntax-rules ()
((delay e) (make-promise (lambda () e)))))
(define-syntax case
(syntax-rules (else)
((case e1 (else body +))
(begin e1 body +))
((case e1 (z body +))
(if (memv e1 'z) (begin body +)))
((case e1 (z body +) clause +)
(let ((temp e1))
(if (memv temp 'z)
(begin body +)
(case temp clause +))))))
;; This one doesn't really work.
(define-syntax quasiquote
(syntax-rules (unquote unquote-splicing)
(`(,@exp . template) (append exp `template))
(`(template1 . template2) (cons `template1 `template2))
(`,exp exp)
(`thing 'thing)))
(define-syntax let*-syntax
(syntax-rules ()
((let*-syntax () body)
(let-syntax () body))
((let*-syntax ((name1 val1) (name val) *) body)
(let-syntax ((name1 val1)) (let*-syntax ((name val) *) body)))))
))
; (put 'syntax-rules 'scheme-indent-hook 1)