From d98d1cb26f8cd3aa49f9c1e9f461ae0ee176df7c Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 13 Mar 2019 19:55:56 -0400 Subject: The general shape of the compiler has been recognized as a program unto itself (albeit a program which must be parameterized). --- stdlib/source/program/compositor.lux | 96 ++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 stdlib/source/program/compositor.lux (limited to 'stdlib/source/program/compositor.lux') diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux new file mode 100644 index 000000000..5fb90837f --- /dev/null +++ b/stdlib/source/program/compositor.lux @@ -0,0 +1,96 @@ +(.module: + [lux #* + [type (#+ :share)] + [cli (#+ program:)] + ["." io (#+ IO io)] + [control + [monad (#+ do)]] + [data + ["." error (#+ Error)] + ["." text + format]] + [time + ["." instant (#+ Instant)]] + [world + ["." console]] + [tool + [compiler + ["." statement] + [phase + [macro (#+ Expander)] + ["." generation]] + [default + ["." platform (#+ Platform)] + ["." syntax]] + [meta + ["." archive (#+ Archive)]]] + ## ["." interpreter] + ]] + [/ + ["." cli (#+ Service)]]) + +(def: (or-crash! failure-description action) + (All [a] + (-> Text (IO (Error a)) (IO a))) + (do io.monad + [?output action] + (case ?output + (#error.Failure error) + (exec (log! (format text.new-line + failure-description text.new-line + error text.new-line)) + (io.exit +1)) + + (#error.Success output) + (wrap output)))) + +(def: (timed action) + (All [a] + (-> (-> Any (IO (Error a))) (IO (Error a)))) + (do (error.with io.monad) + [start (: (IO (Error Instant)) + (error.lift io.monad instant.now)) + result (action []) + finish (: (IO (Error Instant)) + (error.lift io.monad instant.now)) + #let [elapsed-time (instant.span start finish) + _ (log! (format text.new-line + "Elapsed time: " (%duration elapsed-time)))]] + (wrap result))) + +(def: #export (compiler expander platform bundle service) + (All [anchor expression statement] + (-> Expander + (IO (Platform IO anchor expression statement)) + (generation.Bundle anchor expression statement) + Service + (IO Any))) + (do io.monad + [platform platform + console (:: @ map error.assume console.system)] + (case service + (#cli.Compilation configuration) + (<| (or-crash! "Compilation failed:") + ..timed + (function (_ _) + (do (error.with io.monad) + [state (:share [anchor expression statement] + {(Platform IO anchor expression statement) + platform} + {(IO (Error (statement.State+ anchor expression statement))) + (platform.initialize expander platform bundle)}) + _ (:share [anchor expression statement] + {(Platform IO anchor expression statement) + platform} + {(IO (Error [Archive (statement.State+ anchor expression statement)])) + (platform.compile expander platform configuration archive.empty state)}) + ## _ (cache/io.clean target ...) + ] + (wrap (log! "Compilation complete!"))))) + + (#cli.Interpretation configuration) + ## TODO: Fix the interpreter... + (undefined) + ## (<| (or-crash! "Interpretation failed:") + ## (interpreter.run (error.with io.monad) console platform configuration bundle)) + ))) -- cgit v1.2.3