From bd433efacc33492705b09953d321b844d2b1c9f0 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sun, 3 Mar 2019 01:11:26 -0400 Subject: Factored-out general compiler program machinery. --- new-luxc/source/luxc/lang/translation/jvm.lux | 2 +- new-luxc/source/program.lux | 122 ++++++++------------------ stdlib/source/lux/tool/compiler/program.lux | 94 ++++++++++++++++++++ 3 files changed, 133 insertions(+), 85 deletions(-) create mode 100644 stdlib/source/lux/tool/compiler/program.lux diff --git a/new-luxc/source/luxc/lang/translation/jvm.lux b/new-luxc/source/luxc/lang/translation/jvm.lux index 5ffb60482..01bc2b36f 100644 --- a/new-luxc/source/luxc/lang/translation/jvm.lux +++ b/new-luxc/source/luxc/lang/translation/jvm.lux @@ -120,7 +120,7 @@ [value (evaluate! library loader class-name valueI)] (wrap [class-name value])))) -(def: #export init +(def: #export host (IO Host) (io (let [library (loader.new-library []) loader (loader.memory library)] diff --git a/new-luxc/source/program.lux b/new-luxc/source/program.lux index 0f761d70d..c4fe26e0b 100644 --- a/new-luxc/source/program.lux +++ b/new-luxc/source/program.lux @@ -3,104 +3,58 @@ [cli (#+ program:)] [control [monad (#+ do)]] - [data - ["." error (#+ Error)] - ["." text - format]] - ["." io (#+ IO io)] - [time - ["." instant (#+ Instant)]] + ["." io (#+ IO)] [world - ["." file (#+ File)] - ["." console]] + ["." file]] + [host + ["." js]] [tool - ["." compiler - ["." cli (#+ Configuration)] - [meta - ["." archive] - [io - ["." context]]] - ["." phase - ["." translation] + [compiler + ["." cli] + ["/" program] + [phase + [analysis + [".A" macro]] + ["." translation + [".T" js + [".JS" runtime] + [".JS" expression] + [".JS" extension]]] ["." statement]] [default - ["." platform (#+ Platform)] - ["." init] - ["." syntax]]] - ## ["." interpreter] - ]] + ["." platform (#+ Platform)]]]]] [luxc [lang - ["." host/jvm] + [host + ["." jvm]] [translation - ["." jvm - ["." runtime] - ["." expression] + [".T" jvm + [".JVM" runtime] + [".JVM" expression] [procedure - ["." common]]]]]]) + [".JVM" common]]]]]] + ) -(def: (or-crash! failure-description action) - (All [a] - (-> Text (IO (Error a)) (IO a))) +(def: jvm + (IO (Platform IO jvm.Anchor jvm.Inst jvm.Definition)) (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))) + [host jvmT.host] + (wrap {#platform.&monad io.monad + #platform.&file-system file.system + #platform.host host + #platform.phase expressionJVM.translate + #platform.runtime runtimeJVM.translate}))) -(def: jvm-platform - (IO (Platform IO host/jvm.Anchor host/jvm.Inst host/jvm.Definition)) +(def: js + (IO (Platform IO js.Var js.Expression js.Statement)) (do io.monad - [host jvm.init] + [host jsT.host] (wrap {#platform.&monad io.monad #platform.&file-system file.system #platform.host host - #platform.phase expression.translate - #platform.runtime runtime.translate}))) + #platform.phase expressionJS.translate + #platform.runtime runtimeJS.translate}))) (program: [{service cli.service}] - (do io.monad - [platform (: (IO (Platform IO host/jvm.Anchor host/jvm.Inst host/jvm.Definition)) - ..jvm-platform) - console (:: @ map error.assume console.system)] - (case service - (#cli.Compilation configuration) - (<| (or-crash! "Compilation failed:") - ..timed - (function (_ _) - (do (error.with io.monad) - [state (: (IO (Error (statement.State+ host/jvm.Anchor host/jvm.Inst host/jvm.Definition))) - (platform.initialize platform common.bundle)) - ## _ (platform.compile platform (set@ #cli.module syntax.prelude configuration) state) - _ (: (IO (Error Any)) - (platform.compile platform configuration 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 common.bundle)) - ))) + ## (/.compiler ..js commonJVM.bundle service) + (/.compiler macroA.jvm ..js extensionJS.bundle service)) diff --git a/stdlib/source/lux/tool/compiler/program.lux b/stdlib/source/lux/tool/compiler/program.lux new file mode 100644 index 000000000..4194e0e8d --- /dev/null +++ b/stdlib/source/lux/tool/compiler/program.lux @@ -0,0 +1,94 @@ +(.module: + [lux #* + [type (#+ :share)] + [cli (#+ program:)] + ["." io (#+ IO io)] + [control + [monad (#+ do)]] + [data + ["." error (#+ Error)] + ["." text + format]] + [time + ["." instant (#+ Instant)]] + [world + ["." console]] + [tool + [compiler + [phase + [analysis + [macro (#+ Expander)]] + ["." translation] + ["." statement]] + [default + ["." platform (#+ Platform)] + ["." syntax]]] + ## ["." 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)) + (translation.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)}) + _ (: (IO (Error Any)) + (platform.compile expander platform (set@ #cli.module syntax.prelude configuration) state)) + ## _ (: (IO (Error Any)) + ## (platform.compile expander platform configuration 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