From d544e863afbb5b52ba0299724846497fdaf308d1 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 17 Apr 2019 19:25:23 -0400 Subject: Now "refreshing" the evaluator every time a new definition is processed. --- stdlib/source/lux/tool/compiler/default/init.lux | 24 ++------------- .../tool/compiler/phase/extension/statement.lux | 36 +++++++++++++++++----- .../source/lux/tool/compiler/phase/generation.lux | 27 ++++++++++------ .../tool/compiler/phase/generation/reference.lux | 6 ++-- 4 files changed, 53 insertions(+), 40 deletions(-) diff --git a/stdlib/source/lux/tool/compiler/default/init.lux b/stdlib/source/lux/tool/compiler/default/init.lux index fbd0aa772..604fd8551 100644 --- a/stdlib/source/lux/tool/compiler/default/init.lux +++ b/stdlib/source/lux/tool/compiler/default/init.lux @@ -58,22 +58,6 @@ #.version //.version #.mode #.Build}) -(def: (refresh expander) - (All [anchor expression statement] - (-> Expander (///statement.Operation anchor expression statement Any))) - (do ///phase.monad - [[bundle state] ///phase.get-state - #let [eval (//evaluation.evaluator expander - (get@ [#///statement.synthesis #///statement.state] state) - (get@ [#///statement.generation #///statement.state] state) - (get@ [#///statement.generation #///statement.phase] state))]] - (///phase.set-state [bundle - (update@ [#///statement.analysis #///statement.state] - (: (-> ///analysis.State+ ///analysis.State+) - (|>> product.right - [(analysisE.bundle eval)])) - state)]))) - (def: #export (state expander host generate generation-bundle program) (All [anchor expression statement] (-> Expander @@ -86,7 +70,7 @@ generation-state [generation-bundle (generation.state host)] eval (//evaluation.evaluator expander synthesis-state generation-state generate) analysis-state [(analysisE.bundle eval) (///analysis.state ..info host)]] - [(statementE.bundle program) + [(statementE.bundle expander program) {#///statement.analysis {#///statement.state analysis-state #///statement.phase (analysisP.phase expander)} #///statement.synthesis {#///statement.state synthesis-state @@ -178,8 +162,7 @@ (do ///phase.monad [[source code] (///statement.lift-analysis (..read source reader)) - [requirements post-buffer] (process-statement expander pre-buffer code) - _ (..refresh expander)] + [requirements post-buffer] (process-statement expander pre-buffer code)] (wrap [source requirements post-buffer]))) (def: (iterate expander module source pre-buffer aliases) @@ -260,8 +243,7 @@ ///statement.lift-analysis extension.lift macro.current-module) - _ (monad.map @ execute! (get@ #///statement.referrals requirements)) - _ (..refresh expander)] + _ (monad.map @ execute! (get@ #///statement.referrals requirements))] (..iterate expander module source buffer (..module-aliases analysis-module))))))})]) )))))})))) diff --git a/stdlib/source/lux/tool/compiler/phase/extension/statement.lux b/stdlib/source/lux/tool/compiler/phase/extension/statement.lux index 10a3b4985..629e5af59 100644 --- a/stdlib/source/lux/tool/compiler/phase/extension/statement.lux +++ b/stdlib/source/lux/tool/compiler/phase/extension/statement.lux @@ -6,6 +6,7 @@ [io (#+ IO)] ["p" parser]] [data + ["." product] ["." maybe] ["." error] [text @@ -20,7 +21,9 @@ ["." check]]] ["." // ["#." bundle] + ["#." analysis] ["#/" // + ["#." macro (#+ Expander)] ["#." generation] [analysis ["." module] @@ -28,7 +31,9 @@ ["#/" // #_ ["#." analysis] ["#." synthesis (#+ Synthesis)] - ["#." statement (#+ Import Operation Handler Bundle)]]]]) + ["#." statement (#+ Import Operation Handler Bundle)] + [default + ["#." evaluation]]]]]) ## TODO: Inline "evaluate!'" into "evaluate!" ASAP (def: (evaluate!' generate code//type codeS) @@ -123,8 +128,24 @@ (module.declare-tags tags (macro.export? annotations) (:coerce Type value))) (wrap []))))) -(def: lux::def - Handler +(def: (refresh expander) + (All [anchor expression statement] + (-> Expander (Operation anchor expression statement Any))) + (do ///.monad + [[bundle state] ///.get-state + #let [eval (////evaluation.evaluator expander + (get@ [#////statement.synthesis #////statement.state] state) + (get@ [#////statement.generation #////statement.state] state) + (get@ [#////statement.generation #////statement.phase] state))]] + (///.set-state [bundle + (update@ [#////statement.analysis #////statement.state] + (: (-> ////analysis.State+ ////analysis.State+) + (|>> product.right + [(//analysis.bundle eval)])) + state)]))) + +(def: (lux::def expander) + (-> Expander Handler) (function (_ extension-name phase inputsC+) (case inputsC+ (^ (list [_ (#.Identifier ["" short-name])] valueC annotationsC)) @@ -142,7 +163,8 @@ _ (..define short-name value//type annotationsV valueV) #let [_ (log! (format "Definition " (%name full-name)))] _ (////statement.lift-generation - (///generation.learn full-name valueN))] + (///generation.learn full-name valueN)) + _ (..refresh expander)] (wrap ////statement.no-requirements)) _ @@ -309,10 +331,10 @@ (dictionary.put "program" (def::program program)) ))) -(def: #export (bundle program) +(def: #export (bundle expander program) (All [anchor expression statement] - (-> (-> expression statement) (Bundle anchor expression statement))) + (-> Expander (-> expression statement) (Bundle anchor expression statement))) (<| (//bundle.prefix "lux") (|> //bundle.empty - (dictionary.put "def" lux::def) + (dictionary.put "def" (lux::def expander)) (dictionary.merge (..bundle::def program))))) diff --git a/stdlib/source/lux/tool/compiler/phase/generation.lux b/stdlib/source/lux/tool/compiler/phase/generation.lux index 3053752fe..edf260e19 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation.lux @@ -7,12 +7,13 @@ [data ["." product] ["." error (#+ Error)] - ["." name ("#;." equivalence)] + ["." name ("#@." equivalence)] ["." text format] [collection ["." row (#+ Row)] - ["." dictionary (#+ Dictionary)]]]] + ["." dictionary (#+ Dictionary)] + ["." list ("#@." functor)]]]] ["." // ["." extension] [// @@ -21,13 +22,21 @@ [archive [descriptor (#+ Module)]]]]]) +(type: #export Registry + (Dictionary Name Text)) + (exception: #export (cannot-interpret {error Text}) (exception.report ["Error" error])) -(exception: #export (unknown-lux-name {name Name}) +(exception: #export (unknown-lux-name {name Name} {registry Registry}) (exception.report - ["Name" (%name name)])) + ["Name" (%name name)] + ["Registry" (|> registry + dictionary.keys + (list.sort (:: name.order <)) + (list@map %name) + (text.join-with text.new-line))])) (exception: #export (cannot-overwrite-lux-name {lux-name Name} {old-host-name Text} @@ -68,7 +77,7 @@ #buffer (Maybe (Buffer statement)) #output (Output statement) #counter Nat - #name-cache (Dictionary Name Text)}) + #name-cache Registry}) (template [ ] [(type: #export ( anchor expression statement) @@ -118,8 +127,8 @@ (def: #export empty-buffer Buffer row.empty) (template [ - - ] + + ] [(exception: #export ) (def: #export @@ -221,7 +230,7 @@ ?buffer (extension.read (get@ #buffer))] (case ?buffer (#.Some buffer) - (if (row.any? (|>> product.left (name;= name)) buffer) + (if (row.any? (|>> product.left (name@= name)) buffer) (//.throw cannot-overwrite-output name) (extension.update (set@ #buffer (#.Some (row.add [name code] buffer))))) @@ -245,7 +254,7 @@ (#error.Success [stateE host-name]) #.None - (exception.throw unknown-lux-name lux-name))))) + (exception.throw unknown-lux-name [lux-name cache]))))) (def: #export (learn lux-name host-name) (All [anchor expression statement] diff --git a/stdlib/source/lux/tool/compiler/phase/generation/reference.lux b/stdlib/source/lux/tool/compiler/phase/generation/reference.lux index 4907ada5d..534d58cb1 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation/reference.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation/reference.lux @@ -7,7 +7,7 @@ format]] [type (#+ :share)]] ["." // - ["#/" // ("#;." monad) + ["#/" // ("#@." monad) ["#/" // #_ [synthesis (#+ Synthesis)] ["#." reference (#+ Register Variable Reference)]]]]) @@ -61,13 +61,13 @@ (#////reference.Foreign register) (foreign register)) - ///;wrap)}) + ///@wrap)}) constant (:share [expression] {(-> Text expression) constant} {(All [anchor statement] (-> Name (//.Operation anchor expression statement))) - (|>> //.remember (///;map constant))})] + (|>> //.remember (///@map constant))})] (structure (def: local local) (def: foreign foreign) -- cgit v1.2.3