(.module: [lux #* [cli (#+ program:)] [control [monad (#+ do)]] [data ["." error (#+ Error)] ["." text format]] ["." io (#+ IO io)] [time ["." instant (#+ Instant)]] [world ["." file (#+ File)] ["." console]] [tool ["." 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 (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-error 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: jvm-platform (IO (Platform IO host/jvm.Anchor host/jvm.Inst host/jvm.Definition)) (do io.monad [host jvm.init] (wrap {#platform.&monad io.monad #platform.&file-system file.system #platform.host host #platform.phase expression.translate #platform.runtime runtime.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-error 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-error io.monad) console platform configuration common.bundle)) )))