~ chicken-core (chicken-5) 9aaabd5ff9e7ffd8b162bbb6b9dfc57376367e2c
commit 9aaabd5ff9e7ffd8b162bbb6b9dfc57376367e2c Author: Evan Hanson <evhan@foldling.org> AuthorDate: Tue Feb 9 07:22:39 2016 +1300 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Tue Mar 8 22:52:35 2016 +1300 Check library requirement against alternates list in load-extension Rather than expanding `##core#require` into a conditional, pass the list of alternate requirements along to `##sys#load-extension` and check it there. This simlifies the generated code somewhat. diff --git a/core.scm b/core.scm index d5cf54ed..9541644e 100644 --- a/core.scm +++ b/core.scm @@ -138,7 +138,7 @@ ; (##core#foreign-callback-wrapper '<name> <qualifiers> '<type> '({<type>}) <exp>) ; (##core#define-external-variable <name> <type> <bool> [<symbol>]) ; (##core#check <exp>) -; (##core#require-for-syntax <exp> ...) +; (##core#require-for-syntax <id> ...) ; (##core#require <id> <id> ...) ; (##core#app <exp> {<exp>}) ; (##core#define-syntax <symbol> <expr>) @@ -670,25 +670,17 @@ '(##core#undefined)) ((##core#require) - (walk - (let loop ((ids (strip-syntax (cdr x))) - (exps '())) - (if (null? ids) - (foldl (lambda (expr e) - `(##core#if ,e (##core#undefined) ,expr)) - (car exps) - (cdr exps)) - (let ((id (car ids)) - (rest (cdr ids))) - (let-values (((exp found type) - (##sys#process-require id #t (null? rest) used-units))) - (unless (not type) - (##sys#hash-table-update! - file-requirements type - (cut lset-adjoin/eq? <> id) - (cut list id))) - (if found exp (loop rest (cons exp exps))))))) - e se dest ldest h ln)) + (let ((id (cadr x)) + (alternates (cddr x))) + (let-values (((exp found type) + (##sys#process-require id #t alternates used-units))) + (unless (not type) + (##sys#hash-table-update! + file-requirements type + (cut lset-adjoin/eq? <> id) + (cut list id))) + (walk `(##core#begin ,exp (##core#undefined)) + e se dest ldest h ln)))) ((##core#let) (let* ((bindings (cadr x)) diff --git a/eval.scm b/eval.scm index 9b3784ee..80f7c25c 100644 --- a/eval.scm +++ b/eval.scm @@ -714,13 +714,10 @@ [(##core#require) (compile - (let loop ((ids (strip-syntax (cdr x)))) - (if (null? ids) - '(##core#undefined) - (let ((id (car ids)) - (rest (cdr ids))) - (let-values (((exp _ _) (##sys#process-require id #f (null? rest)))) - `(##core#if ,exp (##core#undefined) ,(loop rest)))))) + (let ((id (cadr x)) + (alternates (cddr x))) + (let-values (((exp _ _) (##sys#process-require id #f alternates))) + `(##core#begin ,exp (##core#undefined)))) e #f tf cntr se)] [(##core#elaborationtimeonly ##core#elaborationtimetoo) ; <- Note this! @@ -1219,10 +1216,9 @@ (or (check pa) (loop (##sys#slot paths 1)) ) ) ) ) ) ) )) -(define (##sys#load-extension id #!optional loc) - (define (fail message) - (##sys#error loc message id)) +(define (##sys#load-extension id #!optional (alternates '()) loc) (cond ((##sys#provided? id)) + ((any ##sys#provided? alternates)) ((memq id core-units) (or (load-library-0 id #f) (fail "cannot load core library"))) @@ -1237,11 +1233,11 @@ (define (load-extension id) (##sys#check-symbol id 'load-extension) - (##sys#load-extension id 'load-extension)) + (##sys#load-extension id '() 'load-extension)) (define (require . ids) (for-each (cut ##sys#check-symbol <> 'require) ids) - (for-each (cut ##sys#load-extension <> 'require) ids)) + (for-each (cut ##sys#load-extension <> '() 'require) ids)) (define (provide . ids) (for-each (cut ##sys#check-symbol <> 'provide) ids) @@ -1287,7 +1283,7 @@ ;; - a library id if the library was found, #f otherwise ;; - a requirement type (e.g. 'dynamic) or #f if provided statically ;; -(define (##sys#process-require lib #!optional compiling? dynamic? (static-units '())) +(define (##sys#process-require lib #!optional compiling? (alternates '()) (static-units '())) (let ((id (library-id lib))) (cond ((assq id core-unit-requirements) => @@ -1296,14 +1292,14 @@ (values '(##core#undefined) id #f)) ((memq id static-units) (values '(##core#undefined) id #f)) + ((any (cut memq <> static-units) alternates) + (values '(##core#undefined) id #f)) ((memq id core-units) (values (if compiling? `(##core#declare (uses ,id)) `(##sys#load-library (##core#quote ,id))) id #f)) - ((not dynamic?) - (values `(##sys#provided? (##core#quote ,id)) #f #f)) ((extension-information/internal id #f) => (lambda (info) (let ((s (assq 'syntax info)) @@ -1317,13 +1313,19 @@ ,@(if (or nr (and (not rr) s)) '() (map (lambda (id) - `(##sys#load-extension (##core#quote ,id))) + `(##sys#load-extension + (##core#quote ,id) + (##core#quote ,alternates))) (cond (rr (cdr rr)) (else (list id)))))) id (if s 'dynamic/syntax 'dynamic))))) (else - (values `(##sys#load-extension (##core#quote ,id)) #f 'dynamic))))) + (values `(##sys#load-extension + (##core#quote ,id) + (##core#quote ,alternates)) + #f + 'dynamic))))) ;;; Environments: diff --git a/expand.scm b/expand.scm index 7774f97a..43f48c5f 100644 --- a/expand.scm +++ b/expand.scm @@ -966,7 +966,7 @@ ##sys#current-environment ##sys#macro-environment #f #f 'import)) (if (not lib) '(##core#undefined) - `(##core#require ,(module-requirement name) ,lib)))) + `(##core#require ,lib ,(module-requirement name))))) (cdr x)))))) (##sys#extend-macro-environment @@ -1462,7 +1462,9 @@ `(##core#begin ,@(map (lambda (x) (let-values (((name lib _ _ _ _) (##sys#decompose-import x r c 'import))) - `(##core#require ,(module-requirement name) ,lib))) + (if (not lib) + '(##core#undefined) + `(##core#require ,lib ,(module-requirement name))))) (cdr x)))))) (##sys#extend-macro-environmentTrap