* added environment, environment?, and eval as specified by r6rs.
This commit is contained in:
parent
008457c5f8
commit
29c43af1f4
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -6,8 +6,8 @@
|
|||
;;; (apply (lambda ---) ls) is also common in this file.
|
||||
|
||||
(library (ikarus syntax)
|
||||
(export identifier? syntax-dispatch
|
||||
generate-temporaries free-identifier=? syntax-error
|
||||
(export identifier? syntax-dispatch environment environment?
|
||||
eval generate-temporaries free-identifier=? syntax-error
|
||||
eval-r6rs-top-level boot-library-expand eval-top-level)
|
||||
(import
|
||||
(r6rs)
|
||||
|
@ -16,7 +16,8 @@
|
|||
(chez modules)
|
||||
(ikarus symbols)
|
||||
(ikarus parameters)
|
||||
(only (ikarus) error printf ormap andmap list* format make-record-type void)
|
||||
(only (ikarus) error printf ormap andmap list* format
|
||||
make-record-type void set-rtd-printer! type-descriptor)
|
||||
(only (r6rs syntax-case) syntax-case syntax with-syntax)
|
||||
(prefix (r6rs syntax-case) sys:))
|
||||
(define who 'expander)
|
||||
|
@ -2129,6 +2130,29 @@
|
|||
(values (rtc)
|
||||
(build-letrec* no-source
|
||||
lex* rhs* invoke-body))))))))))))
|
||||
(define-record eval-environment (subst imp*))
|
||||
(define environment
|
||||
(lambda imp*
|
||||
(let-values ([(subst imp*) (get-import-subst/libs imp*)])
|
||||
(make-eval-environment subst imp*))))
|
||||
(define environment?
|
||||
(lambda (x) (eval-environment? x)))
|
||||
(define eval
|
||||
(lambda (x env)
|
||||
(unless (eval-environment? env)
|
||||
(error 'eval "~s is not an environment" env))
|
||||
(let ([subst (eval-environment-subst env)])
|
||||
(let ([rib (make-top-rib subst)])
|
||||
(let ([x (stx x top-mark* (list rib))]
|
||||
[rtc (make-collector)]
|
||||
[vtc (make-collector)])
|
||||
(let ([x
|
||||
(parameterize ([inv-collector rtc]
|
||||
[vis-collector vtc])
|
||||
(chi-expr x '() '()))])
|
||||
(seal-rib! rib)
|
||||
(for-each invoke-library (rtc))
|
||||
(eval-core x)))))))
|
||||
(define (visit! macro*)
|
||||
(for-each (lambda (x)
|
||||
(let ([loc (car x)] [proc (cadr x)])
|
||||
|
@ -2246,6 +2270,11 @@
|
|||
(for-each eval-binding (reverse (cdr init*)))
|
||||
(eval-binding (car init*))])))))
|
||||
;;; FIXME: export the rest of the syntax-case procedures
|
||||
(set-rtd-printer! (type-descriptor eval-environment)
|
||||
(lambda (x p)
|
||||
(unless (eval-environment? x)
|
||||
(error 'record-type-printer "not an environment"))
|
||||
(display (format "#<environment>") p)))
|
||||
(current-library-expander
|
||||
(lambda (x)
|
||||
(library-expander x)
|
||||
|
|
|
@ -380,6 +380,9 @@
|
|||
[load i]
|
||||
[assembler-output i]
|
||||
[new-cafe i]
|
||||
[eval i]
|
||||
[environment i]
|
||||
[environment? i]
|
||||
[time-it i]
|
||||
[command-line-arguments i]
|
||||
[record? i]
|
||||
|
|
Loading…
Reference in New Issue