df06fabda353c5d88c0463e63f3d260c584abf0258ff2e3b9ca500481f4e0658.tri (5080B)
1 !import prelude * 2 !import parser * 3 !import source_order * 4 !import source_compile * 5 !import source_program * 6 !import source_resolve * 7 !import source_ast * 8 !import source_stable * 9 !export * 10 11 -- Build definition bindings in stable dependency order, including unused 12 -- definitions. The reducer may defer normalization of unused body trees. 13 -- Extend the association list at the head in O(1); resolution sees local 14 -- definitions before supplied external bindings. 15 sourceCompileDefinition environment definition = (lazyResult 16 (diagnostic remainder : err diagnostic remainder) 17 (core unused : sourceCompileCore core) 18 (resolveGateAst environment (sourceDefinitionBody definition))) 19 20 sourceCompileOrderedWith compileDefinition names definitions external = (let rec 21 walk pending compiled = (lazyList 22 (_ : ok compiled t) 23 (name rest : lazyMaybe 24 (_ : err (parserDiagnostic 33 name t t t) name) 25 (definition : lazyResult 26 (diagnostic remainder : err diagnostic remainder) 27 (tree unused : walk rest (pair (pair name tree) compiled)) 28 (compileDefinition (append compiled external) definition)) 29 (sourceFindDefinition definitions name)) pending) 30 in walk names t) 31 sourceCompileOrdered names definitions external = 32 sourceCompileOrderedWith sourceCompileDefinition names definitions external 33 34 -- Explicit selection: a local `main` wins, otherwise the final expression, 35 -- otherwise a missing-root diagnostic. Definitions are ordered first. 36 sourceSelectProgram external program compiled = 37 lazyMaybe 38 (_ : lazyMaybe 39 (_ : err (parserDiagnostic 32 "main" t t t) t) 40 (expression : 41 lazyResult 42 (diagnostic remainder : err diagnostic remainder) 43 (core unused : sourceCompileCore core) 44 (resolveGateAst (append compiled external) expression)) 45 (sourceProgramFinal program)) 46 (tree : ok tree t) 47 (sourceFindExternal compiled "main") 48 49 -- The reusable single-unit boundary also returns compiled definitions in 50 -- stable dependency order. Values remain raw trees, not compiler-private ASTs. 51 compileGateProgramOutput external characters = 52 parserMatchReply 53 (diagnostic remainder consumed committed : err diagnostic remainder) 54 (program remainder consumed committed : (do stableBind 55 ordered <- orderGateProgram external program 56 compiled <- sourceCompileOrdered ordered (sourceProgramDefinitions program) external 57 root <- sourceSelectProgram external program compiled 58 ok (pair root (reverse compiled)) t)) 59 (parseGateProgram characters) 60 61 -- Public single-unit boundary. Keep the environment explicit: it contains 62 -- already-resolved (name, tree) bindings, not paths or import directives. 63 -- The selected root and dependency-ordered definitions are returned together; 64 -- parsing, ordering and compilation failures retain their structured replies. 65 compileSource environment sourceCharacters = 66 compileGateProgramOutput environment sourceCharacters 67 68 -- Module units have explicit exports, not an implicit `main` or final value. 69 -- This entrypoint shares the ordinary parser, orderer, resolver and reference 70 -- backend, but rejects a final expression instead of requiring a root. 71 sourceModuleCheckShadows imports definitions = (let rec 72 walk remaining = (lazyList 73 (_ : ok t t) 74 (binding rest : lazyMaybe 75 (_ : walk rest) 76 (definition : err 77 (parserDiagnostic 46 (fst binding) (fst binding) 78 (sourceDefinitionPosition definition) t) t) 79 (sourceFindDefinition definitions (fst binding))) remaining) 80 in walk imports) 81 82 compileModuleDefinitionsWith orderProgram compileDefinition environment characters = 83 parserMatchReply 84 (diagnostic remainder consumed committed : err diagnostic remainder) 85 (program remainder consumed committed : 86 lazyMaybe 87 (_ : (do stableBind 88 sourceModuleCheckShadows environment (sourceProgramDefinitions program) 89 ordered <- orderProgram environment program 90 compiled <- sourceCompileOrderedWith compileDefinition ordered 91 (sourceProgramDefinitions program) environment 92 ok (reverse compiled) t)) 93 (expression : err 94 (parserDiagnostic 42 "definitions only" t 95 (sourceAstStart expression) t) expression) 96 (sourceProgramFinal program)) 97 (parseGateProgram characters) 98 99 -- Backend selection is explicit. Existing entrypoints retain optimized trees. 100 compileModuleDefinitions environment characters = 101 compileModuleDefinitionsWith orderGateProgram sourceCompileDefinition environment characters 102 compileStableModuleDefinitions environment characters = 103 compileModuleDefinitionsWith orderStableProgram sourceCompileStableDefinition environment characters 104 105 -- Preserve the established gate API: callers interested only in the root 106 -- do not have to inspect (or force) the compiled definition environment. 107 compileGateProgram external characters = 108 lazyResult 109 (diagnostic remainder : err diagnostic remainder) 110 (output unused : ok (fst output) t) 111 (compileGateProgramOutput external characters) 112