~ chicken-core (chicken-5) 36eb3e9ba7395119132f9c5ee9ef78b33add91b8
commit 36eb3e9ba7395119132f9c5ee9ef78b33add91b8 Author: Evan Hanson <evhan@foldling.org> AuthorDate: Thu Jul 9 13:50:45 2015 +1200 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Thu Jul 9 13:50:45 2015 +1200 Use module-namespaced load procedures Replaces `##sys#load` with a module-internal equivalent and redefines `load`, `load-relative`, and `load-noisily` to use that. diff --git a/csi.scm b/csi.scm index 5b983be5..7e48e8dc 100644 --- a/csi.scm +++ b/csi.scm @@ -1126,8 +1126,8 @@ EOF (set! args (cdr args)) ) (else (let ((scr (and script (car script)))) - (##sys#load - arg + (load + arg (and (equal? "-sx" scr) (lambda (x) (let* ((str (with-output-to-string (cut pretty-print x))) @@ -1141,8 +1141,7 @@ EOF (when (char=? #\newline c) (display "; " ##sys#standard-error)))) (newline ##sys#standard-error) - (eval x)))) - #f) + (eval x))))) (when (equal? "-ss" scr) (call-with-values (cut main (command-line-arguments)) (lambda results diff --git a/eval.scm b/eval.scm index 0d752b8f..aadb0136 100644 --- a/eval.scm +++ b/eval.scm @@ -959,111 +959,109 @@ (loop (##sys#slot mode 1)) ) ) (##sys#set-dlopen-flags! now global) ) ) -(define load) -(define load-noisily) -(define load-relative) - -(let ([read read] - [write write] - [display display] - [newline newline] - [eval eval] - [open-input-file open-input-file] - [close-input-port close-input-port] - [string-append string-append] - [topentry (##sys#make-c-string "C_toplevel")] ) - (define (has-sep? str) - (let loop ([i (fx- (##sys#size str) 1)]) - (and (not (zero? i)) - (if (memq (##core#inline "C_subchar" str i) '(#\\ #\/)) - i - (loop (fx- i 1)) ) ) ) ) - (define (badfile x) - (##sys#signal-hook #:type-error 'load "bad argument type - not a port or string" x) ) - (set! ##sys#load - (lambda (input evaluator pf #!optional timer printer) - (let* ((fname - (cond [(port? input) #f] - [(not (string? input)) (badfile input)] - ((##sys#file-exists? input #t #f 'load) input) - (else - (let ([fname2 (##sys#string-append input ##sys#load-dynamic-extension)]) - (if (and (not ##sys#dload-disabled) - (##sys#fudge 24) ; dload? - (##sys#file-exists? fname2 #t #f 'load)) - fname2 - (let ([fname3 (##sys#string-append input source-file-extension)]) - (if (##sys#file-exists? fname3 #t #f 'load) - fname3 - input) ) ) ) ))) - [evproc (or evaluator eval)] ) - (cond [(and (string? input) (not fname)) - (##sys#signal-hook #:file-error 'load "cannot open file" input) ] - [(and (load-verbose) fname) - (display "; loading ") - (display fname) - (display " ...\n") - (flush-output)] ) - (or (and fname - (or (##sys#dload (##sys#make-c-string fname 'load) topentry) - (and (not (has-sep? fname)) - (##sys#dload - (##sys#make-c-string - (##sys#string-append "./" fname) - 'load) - topentry) ) ) ) - (call-with-current-continuation - (lambda (abrt) - (fluid-let ((##sys#read-error-with-line-number #t) - (##sys#current-source-filename fname) - (##sys#current-load-path - (and fname - (let ((i (has-sep? fname))) - (if i (##sys#substring fname 0 (fx+ i 1)) "") ) ) ) - (##sys#abort-load (lambda () (abrt #f))) ) - (let ((in (if fname (open-input-file fname) input))) - (##sys#dynamic-wind - (lambda () #f) - (lambda () - (let ((c1 (peek-char in))) - (when (eq? c1 (integer->char 127)) - (##sys#error - 'load - (##sys#string-append - "unable to load compiled module - " - (or _dlerror "unknown reason")) - fname))) - (let ((x1 (read in))) - (do ((x x1 (read in))) - ((eof-object? x)) - (when printer (printer x)) - (##sys#call-with-values - (lambda () - (if timer - (time (evproc x)) - (evproc x) ) ) - (lambda results - (when pf - (for-each - (lambda (r) - (write r) - (newline) ) - results) ) ) ) ) ) ) - (lambda () (close-input-port in)) ) ) ) ) ) ) - (##core#undefined) ) ) ) - (set! load - (lambda (filename . evaluator) - (##sys#load filename (optional evaluator #f) #f) ) ) - (set! load-relative - (lambda (filename . evaluator) - (##sys#load - (if (memq (string-ref filename 0) '(#\\ #\/)) - filename - (##sys#string-append ##sys#current-load-path filename) ) - (optional evaluator #f) #f) ) ) - (set! load-noisily - (lambda (filename #!key (evaluator #f) (time #f) (printer #f)) - (##sys#load filename evaluator #t time printer) ) ) ) +(define load/internal + (let ((read read) + (write write) + (display display) + (newline newline) + (eval eval) + (open-input-file open-input-file) + (close-input-port close-input-port) + (string-append string-append)) + (lambda (input evaluator #!optional pf timer printer) + (define evalproc + (or evaluator eval)) + (define topentry + (##sys#make-c-string "C_toplevel")) + (define (has-sep? str) + (let loop ([i (fx- (##sys#size str) 1)]) + (and (not (zero? i)) + (if (memq (##core#inline "C_subchar" str i) '(#\\ #\/)) + i + (loop (fx- i 1)))))) + (define fname + (cond ((port? input) #f) + ((not (string? input)) + (##sys#signal-hook #:type-error 'load "bad argument type - not a port or string" input)) + ((##sys#file-exists? input #t #f 'load) input) + (else + (let ([fname2 (##sys#string-append input ##sys#load-dynamic-extension)]) + (if (and (not ##sys#dload-disabled) + (##sys#fudge 24) ; dload? + (##sys#file-exists? fname2 #t #f 'load)) + fname2 + (let ([fname3 (##sys#string-append input source-file-extension)]) + (if (##sys#file-exists? fname3 #t #f 'load) + fname3 + input))))))) + (when (and (string? input) (not fname)) + (##sys#signal-hook #:file-error 'load "cannot open file" input)) + (when (and (load-verbose) fname) + (display "; loading ") + (display fname) + (display " ...\n") + (flush-output)) + (or (and fname + (or (##sys#dload (##sys#make-c-string fname 'load) topentry) + (and (not (has-sep? fname)) + (##sys#dload + (##sys#make-c-string + (##sys#string-append "./" fname) + 'load) + topentry)))) + (call-with-current-continuation + (lambda (abrt) + (fluid-let ((##sys#read-error-with-line-number #t) + (##sys#current-source-filename fname) + (##sys#current-load-path + (and fname + (let ((i (has-sep? fname))) + (if i (##sys#substring fname 0 (fx+ i 1)) "")))) + (##sys#abort-load (lambda () (abrt #f)))) + (let ((in (if fname (open-input-file fname) input))) + (##sys#dynamic-wind + (lambda () #f) + (lambda () + (let ((c1 (peek-char in))) + (when (eq? c1 (integer->char 127)) + (##sys#error + 'load + (##sys#string-append + "unable to load compiled module - " + (or _dlerror "unknown reason")) + fname))) + (let ((x1 (read in))) + (do ((x x1 (read in))) + ((eof-object? x)) + (when printer (printer x)) + (##sys#call-with-values + (lambda () + (if timer + (time (evalproc x)) + (evalproc x))) + (lambda results + (when pf + (for-each + (lambda (r) + (write r) + (newline)) + results))))))) + (lambda () + (close-input-port in)))))))) + (##core#undefined)))) + +(define (load filename . evaluator) + (load/internal filename (optional evaluator #f))) + +(define (load-relative filename . evaluator) + (load/internal + (if (memq (string-ref filename 0) '(#\\ #\/)) + filename + (##sys#string-append ##sys#current-load-path filename)) + (optional evaluator #f))) + +(define (load-noisily filename #!key (evaluator #f) (time #f) (printer #f)) + (load/internal filename evaluator #t time printer)) (define ##sys#load-library-extension ; this is crude... (cond [(eq? (software-type) 'windows) windows-load-library-extension] @@ -1237,7 +1235,7 @@ (else (let ([id2 (##sys#find-extension p #f)]) (cond (id2 - (##sys#load id2 #f #f) + (load/internal id2 #f) (set! ##sys#loaded-extensions (cons p ##sys#loaded-extensions)) #t) (err? (##sys#error loc "cannot load extension" id)) diff --git a/modules.scm b/modules.scm index 04513ac2..0d29b930 100644 --- a/modules.scm +++ b/modules.scm @@ -565,7 +565,7 @@ (##sys#macro-environment (##sys#meta-macro-environment))) (fluid-let ((##sys#notices-enabled #f)) ; to avoid re-import warnings - (##sys#load il #f #f))) + (chicken.eval#load il))) (set! mod (##sys#find-module mname 'import))) (else (##sys#syntax-error-hookTrap