(.module: [lux #* [control [monad (#+ do)]] [data ["." error] ["." text format]] ["." io (#+ IO Process io)] [time ["." instant]] [cli (#+ program:)] [world ["." file (#+ File)] ["." console]] [platform ["." compiler ["." cli (#+ Configuration)] [meta ["." archive] [io ["." context]]] ["." phase ["." translation] ["." statement]] [default ["." platform (#+ Platform)] ["." init] ["." syntax]]]] ## ["." interpreter] ] [luxc [lang ["." host/jvm] [translation ["." jvm ["." runtime] ["." expression] [procedure ["." common]]]]]]) (def: (or-crash! failure-description action) (All [a] (-> Text (Process a) (IO a))) (do io.Monad [?output action] (case ?output (#error.Error 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 (Process a)) (Process a))) (do io.Monad [start (io.from-io instant.now) result (action []) finish (io.from-io instant.now) #let [elapsed-time (instant.span start finish) _ (log! (format text.new-line "Elapsed time: " (%duration elapsed-time)))]] (wrap result))) (def: jvm-platform (IO (Platform Process host/jvm.Anchor host/jvm.Inst host/jvm.Definition)) (do io.Monad [host jvm.init] (wrap {#platform.host host #platform.phase expression.translate #platform.runtime runtime.translate #platform.file-system file.JVM@System}))) (program: [{service cli.service}] (do io.Monad [platform ..jvm-platform console (:: @ map error.assume console.open)] (case service (#cli.Compilation configuration) (<| (or-crash! "Compilation failed:") ..timed (function (_ _) (do (:: (get@ #platform.file-system platform) &monad) [state (platform.initialize platform common.bundle) _ (platform.compile platform (set@ #cli.module syntax.prelude configuration) state) ## _ (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 io.Monad console platform configuration common.bundle)) )))