diff options
author | Eduardo Julian | 2018-08-11 14:44:42 -0400 |
---|---|---|
committer | Eduardo Julian | 2018-08-11 14:44:42 -0400 |
commit | 725bcd5670a5d83c201fac147aedce01d9283d03 (patch) | |
tree | 3942735ba1b19dee9b2ba5a0818f4a6be1cf3cfe /new-luxc/source/luxc | |
parent | 0fe039a41571328a29b7a620643fc5e30e32b9a3 (diff) |
Moved interpreter (REPL) code to stdlib.
Diffstat (limited to 'new-luxc/source/luxc')
-rw-r--r-- | new-luxc/source/luxc/repl.lux | 145 |
1 files changed, 0 insertions, 145 deletions
diff --git a/new-luxc/source/luxc/repl.lux b/new-luxc/source/luxc/repl.lux deleted file mode 100644 index e8da16ae1..000000000 --- a/new-luxc/source/luxc/repl.lux +++ /dev/null @@ -1,145 +0,0 @@ -(.module: - [lux #* - [control - [monad (#+ do)] - ["ex" exception (#+ exception:)]] - [data - ["." maybe] - ["e" error (#+ Error)] - [text ("text/" Equivalence<Text>) - format] - [collection - ["." dictionary]]] - ["." macro] - [type - ["." check]] - [language - [syntax (#+ Aliases)] - [".L" init] - [".L" module] - [".L" scope] - [".L" extension - [".E" analysis]]] - [concurrency - ["." promise] - [task (#+ Task)]] - ["." io] - [world - [file (#+ File)] - [console (#+ Console)]]] - [// - ["." lang - [".L" host] - [".L" translation - [jvm - [".T" runtime]]] - [extension - [".E" synthesis] - [".E" translation] - [".E" statement]]]]) - -(do-template [<name>] - [(exception: #export (<name> {message Text}) - message)] - - [repl-initialization-failed] - [repl-error] - ) - -(def: repl-module "<REPL>") - -(def: no-aliases Aliases (dictionary.new text.Hash<Text>)) - -(def: (initialize source-dirs target-dir console) - (-> (List File) File Console (Task Lux)) - (do promise.Monad<Promise> - [output (promise.future - (do io.Monad<IO> - [host hostL.init-host] - (case (macro.run' (initL.compiler host) - (moduleL.with-module 0 repl-module - runtimeT.translate)) - (#e.Success [compiler _]) - (|> compiler - (set@ [#.info #.mode] #.REPL) - (set@ #.extensions - (:coerce Nothing - {#extensionL.analysis analysisE.defaults - #extensionL.synthesis synthesisE.defaults - #extensionL.translation translationE.defaults - #extensionL.statement statementE.defaults})) - (translationL.translate-module source-dirs target-dir translationL.prelude)) - - (#e.Error error) - (wrap (#e.Error error)))))] - (case output - (#e.Success compiler) - (do task.Monad<Task> - [_ (console.write (format "\nWelcome to the REPL!\n" - "Type \"exit\" to leave.\n\n") - console)] - (wrap compiler)) - - (#e.Error message) - (task.throw repl-initialization-failed message)))) - -(def: (add-line line [where offset input]) - (-> Text Source Source) - [where offset (format input "\n" line)]) - -(def: (repl-translate source-dirs target-dir code) - (-> (List File) File Code (Meta [Type Any])) - (function (_ compiler) - (case ((translationL.translate (translationL.translate-module source-dirs target-dir) - no-aliases - code) - compiler) - (#e.Success [compiler' aliases']) - (#e.Success [compiler' [Nothing []]]) - - (#e.Error error) - (if (ex.match? translationL.Unrecognized-Statement error) - ((do macro.Monad<Meta> - [[var-id varT] (lang.with-type-env check.var) - exprV (scopeL.with-scope repl-module - (evalL.eval varT code)) - ?exprT (lang.with-type-env (check.read var-id))] - (wrap [(maybe.assume ?exprT) exprV])) - compiler) - (#e.Error error))))) - -(def: fresh-source Source [[repl-module 1 0] 0 ""]) - -(def: #export (run source-dirs target-dir) - (-> (List File) File (Task Any)) - (do task.Monad<Task> - [console (promise.future console.open) - compiler (initialize source-dirs target-dir console)] - (loop [compiler compiler - source fresh-source - multi-line? #0] - (do @ - [_ (if multi-line? - (console.write " " console) - (console.write "> " console)) - line (console.read-line console)] - (if (text/= "exit" line) - (console.write "Till next time..." console) - (case (do e.Monad<Error> - [[source' exprC] (syntax.read repl-module no-aliases (add-line line source))] - (macro.run' compiler - (lang.with-current-module repl-module - (do macro.Monad<Meta> - [[exprT exprV] (repl-translate source-dirs target-dir exprC)] - (wrap [source' exprT exprV]))))) - (#e.Success [compiler' [source' exprT exprV]]) - (do @ - [_ (console.write (represent compiler' exprT exprV) console)] - (recur compiler' source' #0)) - - (#e.Error error) - (if (ex.match? syntax.end-of-file error) - (recur compiler source #1) - (exec (log! (ex.construct repl-error error)) - (recur compiler fresh-source #0)))))) - ))) |