aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/program
diff options
context:
space:
mode:
authorEduardo Julian2019-03-13 19:55:56 -0400
committerEduardo Julian2019-03-13 19:55:56 -0400
commitd98d1cb26f8cd3aa49f9c1e9f461ae0ee176df7c (patch)
treeb3500454334fce41b034ab37a2e0594b62354eb2 /stdlib/source/program
parentf49a6d1b8ae5db27270f99ecf92c40c74a4334e3 (diff)
The general shape of the compiler has been recognized as a program unto itself (albeit a program which must be parameterized).
Diffstat (limited to 'stdlib/source/program')
-rw-r--r--stdlib/source/program/compositor.lux96
-rw-r--r--stdlib/source/program/compositor/cli.lux43
2 files changed, 139 insertions, 0 deletions
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))
+ )))
diff --git a/stdlib/source/program/compositor/cli.lux b/stdlib/source/program/compositor/cli.lux
new file mode 100644
index 000000000..e08c83c7e
--- /dev/null
+++ b/stdlib/source/program/compositor/cli.lux
@@ -0,0 +1,43 @@
+(.module:
+ [lux #*
+ [control
+ ["p" parser]]
+ ["." cli (#+ CLI)]
+ [world
+ [file (#+ Path)]]]
+ ## [///
+ ## [importer (#+ Source)]]
+ )
+
+(type: #export Configuration
+ {## #sources (List Source)
+ #sources (List Path)
+ #target Path
+ #module Text})
+
+(type: #export Service
+ (#Compilation Configuration)
+ (#Interpretation Configuration))
+
+(do-template [<name> <long>]
+ [(def: #export <name>
+ (CLI Text)
+ (cli.named <long> cli.any))]
+
+ [source "--source"]
+ [target "--target"]
+ [module "--module"]
+ )
+
+(def: #export configuration
+ (CLI Configuration)
+ ($_ p.and
+ (p.some ..source)
+ ..target
+ ..module))
+
+(def: #export service
+ (CLI Service)
+ ($_ p.or
+ (p.after (cli.this "build") ..configuration)
+ (p.after (cli.this "repl") ..configuration)))