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)
- #f))
- (macro compiler-syntax
- (lambda (form)
- (list 'put
- (list 'quote (cadr form))
- (list 'quote '%syntax)
- (caddr form))))
- (compiler-syntax quote
- (lambda (form) form))
- (compiler-syntax lambda
- (lambda (form)
- (cons
- 'lambda
- (cons
- (cadr form)
- (%expand-list (cddr form))))))
- (compiler-syntax define
- (lambda (form)
- (cons
- 'define
- (cons
- (cadr form)
- (%expand-list (cddr form))))))
- (compiler-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)))
- (compiler-syntax cond
- (lambda (form)
- (cons 'cond (%cond-expander (cdr form)))))
- (define (%expand-let-assignment pair)
- (if (pair? pair)
- (cons
- (car pair)
- (%expand-macros (cdr pair)))
- pair))
- (define (%expand-let-form form)
- (cons
- (car form)
- (cons
- (let ((lyst (cadr form)))
- (if (pair? lyst)
- (map %expand-let-assignment lyst)
- lyst))
- (%expand-list (cddr form)))))
- (compiler-syntax let %expand-let-form)
- (compiler-syntax let* %expand-let-form)
- (compiler-syntax letrec %expand-let-form)
- (macro define-integrable
- (lambda (form)
- (cons 'define (cdr form))))
- (macro declare
- (lambda (form) #f))
- (define APPEND-ME-SYM (gensym))
- (define QQ-EXPANDER
- (lambda (l)
- (letrec
- (
- (qq-lev 0) ; always >= 0
- (QQ-CAR-CDR
- (lambda (exp)
- (let ((qq-car (qq (car exp)))
- (qq-cdr (qq (cdr exp))))
- (if (and (pair? qq-car)
- (eq? (car qq-car) append-me-sym))
- (list 'append (cdr qq-car) qq-cdr)
- (list 'cons qq-car qq-cdr)))))
- (QQ
- (lambda (exp)
- (cond ((symbol? exp)
- (list 'quote exp))
- ((vector? exp)
- (list 'list->vector (qq (vector->list exp))))
- ((atom? exp)
- exp)
- ((eq? (car exp) 'quasiquote)
- (set! qq-lev (1+ qq-lev))
- (let ((qq-val
- (if (= qq-lev 1)
- (qq (cadr exp))
- (qq-car-cdr exp))))
- (set! qq-lev (-1+ qq-lev))
- qq-val))
- ((or (eq? (car exp) 'unquote)
- (eq? (car exp) 'unquote-splicing))
- (set! qq-lev (-1+ qq-lev))
- (let ((qq-val
- (if (= qq-lev 0)
- (if (eq? (car exp) 'unquote-splicing)
- (cons append-me-sym
- (%expand-macros (cadr exp)))
- (%expand-macros (cadr exp)))
- (qq-car-cdr exp))))
- (set! qq-lev (1+ qq-lev))
- qq-val))
- (else
- (qq-car-cdr exp)))))
- )
- (let ((expansion (qq l)))
- (if check-qq-expansion-flag
- (check-qq-expansion expansion))
- expansion))))
- (define CHECK-QQ-EXPANSION
- (lambda (exp)
- (cond ((vector? exp)
- (check-qq-expansion (vector->list exp)))
- ((atom? exp)
- #f)
- (else
- (if (eq? (car exp) append-me-sym)
- (error "UNQUOTE-SPLICING in unspliceable position"
- (list 'unquote-splicing (cdr exp)))
- (or (check-qq-expansion (car exp))
- (check-qq-expansion (cdr exp))))))))
- (define CHECK-QQ-EXPANSION-FLAG #t)
- (define UNQ-EXPANDER
- (lambda (l) (error "UNQUOTE outside QUASIQUOTE" l)))
- (define UNQ-SPL-EXPANDER
- (lambda (l) (error "UNQUOTE SPLICING outside QUASIQUOTE" l)))
- (compiler-syntax QUASIQUOTE qq-expander)
- (compiler-syntax UNQUOTE unq-expander)
- (compiler-syntax UNQUOTE-SPLICING unq-spl-expander)
- (define (eval x #!optional env)
- ((if (default-object? env)
- (compile x)
- (compile x env))))
- (define old-apply apply)
- (define (apply f . args)
- (old-apply f (old-apply list* args)))
- (define (autoload-from-file file syms #!optional env)
- (map (lambda (sym) (put sym '%autoload file)) syms)
- '())
- (define (*unbound-handler* sym cont)
- (let ((file (get sym '%autoload)))
- (if file (load file))
- (if (not (bound? sym))
- (error "unbound variable" sym))
- (cont '())))
- (macro case
- (lambda (form)
- (let ((test (cadr form))
- (sym (gensym)))
- `(let ((,sym ,test))
- (cond ,@(map (lambda (x)
- (cond ((eq? (car x) 'else)
- x)
- ((atom? (car x))
- `((eqv? ,sym ',(car x)) ,@(cdr x)))
- (else
- `((memv ,sym ',(car x)) ,@(cdr x)))))
- (cddr form)))))))
- (define (*initialize*)
- (*toplevel*))
- (load "proxy.s")
- (save "proxy.wks")
- (print 'loading-ended)
- (exit)