diff options
Diffstat (limited to 'src/boot')
-rw-r--r-- | src/boot/ast.boot | 2 | ||||
-rw-r--r-- | src/boot/parser.boot | 2 | ||||
-rw-r--r-- | src/boot/strap/parser.clisp | 19 | ||||
-rw-r--r-- | src/boot/strap/translator.clisp | 26 | ||||
-rw-r--r-- | src/boot/translator.boot | 9 |
5 files changed, 41 insertions, 17 deletions
diff --git a/src/boot/ast.boot b/src/boot/ast.boot index 447f9253..d76fcb72 100644 --- a/src/boot/ast.boot +++ b/src/boot/ast.boot @@ -60,7 +60,7 @@ structure %Ast == %Lisp(%String) -- )lisp command %Module(%Symbol,%List,%List) -- module declaration %Namespace(%Symbol) -- namespace AxiomCore - %Import(%Symbol) -- import module + %Import(%Ast) -- import module; import namespace foo %ImportSignature(%Symbol,%Signature) -- import function declaration %TypeAlias(%Head, %List) -- type alias definition %Signature(%Symbol,%Mapping) -- op: S -> T diff --git a/src/boot/parser.boot b/src/boot/parser.boot index 6f625748..a6420449 100644 --- a/src/boot/parser.boot +++ b/src/boot/parser.boot @@ -445,8 +445,10 @@ bpModule() == ++ Import: ++ IMPORT Signature FOR Name ++ IMPORT Name +++ IMPORT Namespace bpImport() == bpEqKey "IMPORT" => + bpNamespace() => bpPush %Import bpPop1() a := bpState() bpName() or bpTrap() bpEqPeek "COLON" => diff --git a/src/boot/strap/parser.clisp b/src/boot/strap/parser.clisp index 7cf584dd..00b784f7 100644 --- a/src/boot/strap/parser.clisp +++ b/src/boot/strap/parser.clisp @@ -484,15 +484,18 @@ (PROG (|a|) (RETURN (COND - ((|bpEqKey| 'IMPORT) (SETQ |a| (|bpState|)) - (OR (|bpName|) (|bpTrap|)) + ((|bpEqKey| 'IMPORT) (COND - ((|bpEqPeek| 'COLON) (|bpRestore| |a|) - (AND (OR (|bpSignature|) (|bpTrap|)) - (OR (|bpEqKey| 'FOR) (|bpTrap|)) - (OR (|bpName|) (|bpTrap|)) - (|bpPush| (|%ImportSignature| (|bpPop1|) (|bpPop1|))))) - (T (|bpPush| (|%Import| (|bpPop1|)))))) + ((|bpNamespace|) (|bpPush| (|%Import| (|bpPop1|)))) + (T (SETQ |a| (|bpState|)) (OR (|bpName|) (|bpTrap|)) + (COND + ((|bpEqPeek| 'COLON) (|bpRestore| |a|) + (AND (OR (|bpSignature|) (|bpTrap|)) + (OR (|bpEqKey| 'FOR) (|bpTrap|)) + (OR (|bpName|) (|bpTrap|)) + (|bpPush| + (|%ImportSignature| (|bpPop1|) (|bpPop1|))))) + (T (|bpPush| (|%Import| (|bpPop1|)))))))) (T NIL))))) (DEFUN |bpNamespace| () diff --git a/src/boot/strap/translator.clisp b/src/boot/strap/translator.clisp index 6e73c749..3992e54d 100644 --- a/src/boot/strap/translator.clisp +++ b/src/boot/strap/translator.clisp @@ -593,8 +593,12 @@ ((NULL |ns|) NIL) (T (LIST (LIST 'EXPORT (LIST 'QUOTE |ns|)))))) +(DEFUN |inAllContexts| (|x|) + (LIST 'EVAL-WHEN (LIST :COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE) + |x|)) + (DEFUN |translateToplevel| (|b| |export?|) - (PROG (|lhs| |t| |ISTMP#2| |n| |ISTMP#1| |sig| |xs|) + (PROG (|lhs| |t| |ISTMP#2| |sig| |n| |ISTMP#1| |xs|) (DECLARE (SPECIAL |$activeNamespace| |$InteractiveMode| |$constantIdentifiers| |$foreignsDefsForCLisp| |$currentModuleName|)) @@ -645,12 +649,20 @@ (CDR |bfVar#12|))))))))) (|%Import| (LET ((|m| (CADR |b|))) - (PROGN - (COND - ((NOT (STRING= (|getOptionValue| '|import|) - "skip")) - (|bootImport| (SYMBOL-NAME |m|)))) - (LIST (LIST 'IMPORT-MODULE (SYMBOL-NAME |m|)))))) + (COND + ((AND (CONSP |m|) (EQ (CAR |m|) '|%Namespace|) + (PROGN + (SETQ |ISTMP#1| (CDR |m|)) + (AND (CONSP |ISTMP#1|) + (NULL (CDR |ISTMP#1|)) + (PROGN (SETQ |n| (CAR |ISTMP#1|)) T)))) + (LIST (|inAllContexts| + (LIST 'USE-PACKAGE (SYMBOL-NAME |n|))))) + (T (COND + ((NOT (STRING= (|getOptionValue| '|import|) + "skip")) + (|bootImport| (SYMBOL-NAME |m|)))) + (LIST (LIST 'IMPORT-MODULE (SYMBOL-NAME |m|))))))) (|%ImportSignature| (LET ((|x| (CADR |b|)) (|sig| (CADDR |b|))) (|genImportDeclaration| |x| |sig|))) diff --git a/src/boot/translator.boot b/src/boot/translator.boot index af1c967b..08b0bfde 100644 --- a/src/boot/translator.boot +++ b/src/boot/translator.boot @@ -407,6 +407,11 @@ exportNames ns == ns = nil => nil [["EXPORT",["QUOTE",ns]]] +inAllContexts x == + ["EVAL-WHEN",[KEYWORD::COMPILE_-TOPLEVEL, + KEYWORD::LOAD_-TOPLEVEL, + KEYWORD::EXECUTE], x] + translateToplevel(b,export?) == atom b => [b] -- generally happens in interactive mode. b is ["TUPLE",:xs] => coreError '"invalid AST" @@ -420,7 +425,9 @@ translateToplevel(b,export?) == [["PROVIDE", symbolName m], :exportNames ns, :[first translateToplevel(d,true) for d in ds]] - %Import(m) => + %Import(m) => + m is ['%Namespace,n] => + [inAllContexts ["USE-PACKAGE",symbolName n]] if getOptionValue "import" ~= '"skip" then bootImport symbolName m [["IMPORT-MODULE", symbolName m]] |