diff --git a/src/ikarus.boot b/src/ikarus.boot index 0d635b4..81cbeec 100644 Binary files a/src/ikarus.boot and b/src/ikarus.boot differ diff --git a/src/libsyntax.ss b/src/libsyntax.ss index e264f37..982adf7 100644 --- a/src/libsyntax.ss +++ b/src/libsyntax.ss @@ -979,6 +979,7 @@ [generate-temporaries generate-temporaries-label (core-prim . generate-temporaries)] [free-identifier=? free-identifier=?-label (core-prim . free-identifier=?)] [chi-top-library chi-top-library-label (core-prim . chi-top-library)] + [boot-library-expand boot-library-expand-label (core-prim . boot-library-expand)] ;;; codes [$closure-code $closure-code-label (core-prim . $closure-code)] [$code? $code?-label (core-prim . $code?)] @@ -2387,7 +2388,7 @@ r mr lhs* lex* rhs* kwd*)] [else (return e* module-init** r mr lhs* lex* rhs*)]))))])))) - (define library-expander^ + (define library-expander (lambda (e) (let-values ([(name exp* b*) (parse-library e)]) (let ([rib (make-scheme-rib)] @@ -2404,11 +2405,6 @@ (build-void) (build-sequence no-source (chi-expr* init* r mr)))))))))) - (define library-expander - (lambda (x) - (let ([v (library-expander^ x)]) - ;(pretty-print v) - v))) (primitive-set! 'identifier? id?) (primitive-set! 'generate-temporaries (lambda (ls) @@ -2430,6 +2426,7 @@ (apply string-append args) (strip x '())))) (primitive-set! 'syntax-dispatch syntax-dispatch) + (primitive-set! 'boot-library-expand library-expander) (primitive-set! 'chi-top-library library-expander)) diff --git a/src/makefile.ss b/src/makefile.ss index bd93f3a..cf8d61e 100755 --- a/src/makefile.ss +++ b/src/makefile.ss @@ -5,30 +5,46 @@ (import (scheme)) (define scheme-library-files - '("libhandlers.ss" - "libcontrol.ss" - "libcollect.ss" - "librecord.ss" - "libcxr.ss" - "libnumerics.ss" - "libguardians.ss" - "libcore.ss" - "libchezio.ss" - "libhash.ss" - "libwriter.ss" - "libtokenizer.ss" - "libassembler.ss" - "libintelasm.ss" - "libfasl.ss" - "libtrace.ss" - "libcompile.ss" - "libsyntax.ss" - "libpp.ss" - "libcafe.ss" - "libposix.ss" - "libtimers.ss" + ;;; Listed in the order in which they're loaded. + ;;; + ;;; Loading of the boot file may segfault if a library is + ;;; loaded before its dependencies are loaded first. + ;;; + ;;; reason is that the base libraries are not a hierarchy of + ;;; dependencies but rather an eco system in which every + ;;; part depends on the other. + ;;; + ;;; For example, the printer may call error if it finds + ;;; an error (e.g. "not an output port"), while the error + ;;; procedure may call the printer to display the message. + ;;; This works fine as long as error does not itself cause + ;;; an error (which may lead to the infamous Error: Error: + ;;; Error: Error: Error: Error: Error: Error: Error: ...). + ;;; + '("libhandlers.ss" + "libcontrol.ss" + "libcollect.ss" + "librecord.ss" + "libcxr.ss" + "libnumerics.ss" + "libguardians.ss" + "libcore.ss" + "libchezio.ss" + "libhash.ss" + "libwriter.ss" + "libtokenizer.ss" + "libassembler.ss" + "libintelasm.ss" + "libfasl.ss" + "libtrace.ss" + "libcompile.ss" + "libsyntax.ss" + "libpp.ss" + "libcafe.ss" + "libposix.ss" + "libtimers.ss" "libtoplevel.ss")) - + (define (read-file file) (with-input-from-file file (lambda () @@ -39,12 +55,13 @@ (cons x (f)))))))) (define (expand-library-file ifile) - (map chi-top-library (read-file ifile))) + (map boot-library-expand (read-file ifile))) (define (expand-all ls) (apply append (map expand-library-file ls))) (printf "expanding ...\n") + (let ([core* (expand-all scheme-library-files)]) (printf "compiling ...\n") (let ([p (open-output-file "ikarus.boot" 'replace)]) @@ -52,6 +69,7 @@ (lambda (x) (compile-core-expr-to-port x p)) core*) (close-output-port p))) + (printf "Happy Happy Joy Joy\n"))