From 1888b5c3288e4e7653a424e7314ea5c8277ab360 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Thu, 16 Apr 2020 00:22:24 -0400 Subject: Generating definition names in a new way. --- lux-mode/lux-mode.el | 1 + luxc/src/lux/compiler/jvm/proc/common.clj | 3 +-- new-luxc/source/luxc/lang/translation/jvm.lux | 5 ++++- .../source/luxc/lang/translation/jvm/runtime.lux | 4 +--- new-luxc/source/program.lux | 1 - stdlib/source/lux/control/exception.lux | 2 +- stdlib/source/lux/debug.lux | 2 +- stdlib/source/lux/tool/compiler/default/init.lux | 25 ++++++++++++---------- .../source/lux/tool/compiler/default/platform.lux | 3 +-- .../lux/tool/compiler/language/lux/analysis.lux | 7 +++--- .../lux/tool/compiler/language/lux/directive.lux | 20 ++++++++++++----- .../lux/tool/compiler/language/lux/generation.lux | 17 +++++++++++---- .../language/lux/phase/analysis/function.lux | 4 ++-- .../language/lux/phase/analysis/inference.lux | 2 +- .../language/lux/phase/analysis/module.lux | 9 ++++---- .../language/lux/phase/analysis/structure.lux | 4 ++-- stdlib/source/lux/tool/compiler/meta/archive.lux | 22 ++++++++++++------- .../lux/tool/compiler/meta/archive/artifact.lux | 10 +++++++++ stdlib/source/program/compositor.lux | 24 ++++++++++----------- 19 files changed, 100 insertions(+), 65 deletions(-) diff --git a/lux-mode/lux-mode.el b/lux-mode/lux-mode.el index e3dfd46f6..16609262b 100644 --- a/lux-mode/lux-mode.el +++ b/lux-mode/lux-mode.el @@ -207,6 +207,7 @@ Called by `imenu--generic-function'." (set-match-data (list def-beg def-end))))) (goto-char start))))) +;; https://www.gnu.org/software/findutils/manual/html_node/find_html/emacs-regular-expression-syntax.html (defun altRE (&rest alternatives) (concat "\\(" (mapconcat 'identity alternatives "\\|") "\\)")) diff --git a/luxc/src/lux/compiler/jvm/proc/common.clj b/luxc/src/lux/compiler/jvm/proc/common.clj index 88b989262..cb5f48c74 100644 --- a/luxc/src/lux/compiler/jvm/proc/common.clj +++ b/luxc/src/lux/compiler/jvm/proc/common.clj @@ -334,8 +334,7 @@ (.visitFieldInsn Opcodes/GETSTATIC "java/lang/System" "out" "Ljava/io/PrintStream;"))] _ (compile ?x) :let [_ (doto *writer* - (.visitTypeInsn Opcodes/CHECKCAST "java/lang/String") - (.visitMethodInsn Opcodes/INVOKEVIRTUAL "java/io/PrintStream" "println" "(Ljava/lang/String;)V") + (.visitMethodInsn Opcodes/INVOKEVIRTUAL "java/io/PrintStream" "println" "(Ljava/lang/Object;)V") (.visitLdcInsn &/unit-tag))]] (return nil))) diff --git a/new-luxc/source/luxc/lang/translation/jvm.lux b/new-luxc/source/luxc/lang/translation/jvm.lux index 8e2cd2af6..390b1497d 100644 --- a/new-luxc/source/luxc/lang/translation/jvm.lux +++ b/new-luxc/source/luxc/lang/translation/jvm.lux @@ -96,9 +96,12 @@ ## TODO: This is a hackish solution to the issue I have. ## It should be cleaned up ASAP. +(def: prefix "lux.") + (def: #export class-name' (-> Text Text) - (text.replace-all .module-separator ..class-path-separator)) + (|>> (text.replace-all .module-separator ..class-path-separator) + (format ..prefix))) (def: #export (class-name module id) (-> Module artifact.ID Text) diff --git a/new-luxc/source/luxc/lang/translation/jvm/runtime.lux b/new-luxc/source/luxc/lang/translation/jvm/runtime.lux index eb3ed9b7f..7d6c5427e 100644 --- a/new-luxc/source/luxc/lang/translation/jvm/runtime.lux +++ b/new-luxc/source/luxc/lang/translation/jvm/runtime.lux @@ -29,11 +29,9 @@ ["_" inst]]]]] ["." // (#+ ByteCode)]) -(def: prefix "lux/") - (def: #export (class-name [module id]) (-> generation.Context Text) - (format ..prefix module "/" (%.nat id))) + (//.class-name module id)) (def: $Text (type.class "java.lang.String" (list))) (def: #export $Tag type.int) diff --git a/new-luxc/source/program.lux b/new-luxc/source/program.lux index 61840abf0..5fbbd0537 100644 --- a/new-luxc/source/program.lux +++ b/new-luxc/source/program.lux @@ -157,7 +157,6 @@ analysis.bundle ..platform @.jvm - module ## generation.bundle translation.bundle (directive.bundle extender) diff --git a/stdlib/source/lux/control/exception.lux b/stdlib/source/lux/control/exception.lux index ed200189c..85236b6fa 100644 --- a/stdlib/source/lux/control/exception.lux +++ b/stdlib/source/lux/control/exception.lux @@ -146,7 +146,7 @@ (|> "-" (list.repeat 64) (text.join-with "")) text.new-line text.new-line)) -(def: #export (decorate prelude error) +(def: (decorate prelude error) (-> Text Text Text) ($_ "lux text concat" prelude diff --git a/stdlib/source/lux/debug.lux b/stdlib/source/lux/debug.lux index db18eb37e..bac74880f 100644 --- a/stdlib/source/lux/debug.lux +++ b/stdlib/source/lux/debug.lux @@ -60,7 +60,7 @@ (import: Array (#static isArray [.Any] host.Boolean)))}))) -(type: Inspector (-> Any Text)) +(def: Inspector (-> Any Text)) (def: (inspect-tuple inspect) (-> Inspector Inspector) diff --git a/stdlib/source/lux/tool/compiler/default/init.lux b/stdlib/source/lux/tool/compiler/default/init.lux index 19a71742c..0b0acd8b0 100644 --- a/stdlib/source/lux/tool/compiler/default/init.lux +++ b/stdlib/source/lux/tool/compiler/default/init.lux @@ -115,15 +115,16 @@ (All [anchor expression directive] (///directive.Operation anchor expression directive [Source (///generation.Buffer directive)]))) - (///directive.lift-analysis - (do ///phase.monad - [#let [module (get@ #///.module input)] - _ (module.create hash module) - _ (///analysis.set-current-module module) - _ (monad.map @ module.import dependencies) - #let [source (///analysis.source (get@ #///.module input) (get@ #///.code input))] - _ (///analysis.set-source-code source)] - (wrap [source ///generation.empty-buffer])))) + (do ///phase.monad + [#let [module (get@ #///.module input)] + _ (///directive.set-current-module module)] + (///directive.lift-analysis + (do ///phase.monad + [_ (module.create hash module) + _ (monad.map @ module.import dependencies) + #let [source (///analysis.source (get@ #///.module input) (get@ #///.code input))] + _ (///analysis.set-source-code source)] + (wrap [source ///generation.empty-buffer]))))) (def: (end module) (-> Module @@ -194,7 +195,7 @@ (#try.Failure error) (if (ex.match? ///syntax.end-of-file error) (#try.Success [state #.None]) - (ex.with-stack ///.cannot-compile module (#try.Failure error))))))) + (ex.with ///.cannot-compile module (#try.Failure error))))))) (def: (default-dependencies prelude input) (-> Module ///.Input (List Module)) @@ -255,7 +256,9 @@ macro.current-module) _ (///directive.lift-generation (///generation.set-buffer temporary-buffer)) - _ (monad.map @ (execute! archive) (get@ #///directive.referrals requirements)) + _ (|> requirements + (get@ #///directive.referrals) + (monad.map @ (execute! archive))) temporary-buffer (..get-current-buffer temporary-buffer)] (..iterate archive expander module source temporary-buffer (..module-aliases analysis-module))))))})]) )))))})))) diff --git a/stdlib/source/lux/tool/compiler/default/platform.lux b/stdlib/source/lux/tool/compiler/default/platform.lux index 51f4729c5..f51711289 100644 --- a/stdlib/source/lux/tool/compiler/default/platform.lux +++ b/stdlib/source/lux/tool/compiler/default/platform.lux @@ -216,8 +216,7 @@ _ ## TODO: The "///analysis.set-current-module" below shouldn't be necessary. Remove it ASAP. ## TODO: The context shouldn't need to be re-set either. - (|> (///analysis.set-current-module module) - ///directive.lift-analysis + (|> (///directive.set-current-module module) (///phase.run' state) try.assume product.left)) diff --git a/stdlib/source/lux/tool/compiler/language/lux/analysis.lux b/stdlib/source/lux/tool/compiler/language/lux/analysis.lux index 6c081620c..8537064a4 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/analysis.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/analysis.lux @@ -343,15 +343,14 @@ (def: #export (with-stack exception message action) (All [e o] (-> (Exception e) e (Operation o) (Operation o))) (function (_ bundle,state) - (case (action bundle,state) + (case (exception.with exception message + (action bundle,state)) (#try.Success output) (#try.Success output) (#try.Failure error) (let [[bundle state] bundle,state] - (#try.Failure (<| (locate-error (get@ #.cursor state)) - (exception.decorate (exception.construct exception message)) - error)))))) + (#try.Failure (locate-error (get@ #.cursor state) error)))))) (template [ ] [(def: #export ( value) diff --git a/stdlib/source/lux/tool/compiler/language/lux/directive.lux b/stdlib/source/lux/tool/compiler/language/lux/directive.lux index 2c1dd3be6..8a5e0172a 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/directive.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/directive.lux @@ -1,5 +1,7 @@ (.module: [lux (#- Module) + [abstract + [monad (#+ do)]] [data [collection ["." list ("#@." monoid)]]]] @@ -57,16 +59,24 @@ ) (template [ ] - [(def: #export ( operation) + [(def: #export (All [anchor expression directive output] (-> ( output) (Operation anchor expression directive output))) - (extension.lift - (phase.sub [(get@ [ #..state]) - (set@ [ #..state])] - operation)))] + (|>> (phase.sub [(get@ [ #..state]) + (set@ [ #..state])]) + extension.lift))] [lift-analysis #..analysis analysis.Operation] [lift-synthesis #..synthesis synthesis.Operation] [lift-generation #..generation (generation.Operation anchor expression directive)] ) + +(def: #export (set-current-module module) + (All [anchor expression directive output] + (-> Module (Operation anchor expression directive Any))) + (do phase.monad + [_ (..lift-analysis + (analysis.set-current-module module))] + (..lift-generation + (generation.enter-module module)))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/generation.lux b/stdlib/source/lux/tool/compiler/language/lux/generation.lux index 1cfd7db0f..84f4f35d4 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/generation.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/generation.lux @@ -4,7 +4,8 @@ [monad (#+ do)]] [control ["." try (#+ Try)] - ["." exception (#+ exception:)]] + ["." exception (#+ exception:)] + ["." function]] [data ["." product] ["." name ("#@." equivalence)] @@ -146,6 +147,11 @@ (-> Text (Operation anchor expression directive Text))) (:: phase.monad map (|>> %.nat (format prefix)) ..next)) +(def: #export (enter-module module) + (All [anchor expression directive] + (-> Module (Operation anchor expression directive Any))) + (extension.update (set@ #module module))) + (template [ ] [(def: #export ( label code) (All [anchor expression directive] @@ -200,9 +206,12 @@ (#try.Success [[bundle (set@ #registry registry' state)] id])))) -(exception: #export (unknown-definition {name Name}) +(exception: #export (unknown-definition {name Name} + {known-definitions (List Text)}) (exception.report - ["Name" (%.name name)])) + ["Definition" (name.short name)] + ["Module" (name.module name)] + ["Known Definitions" (exception.enumerate function.identity known-definitions)])) (def: #export (remember archive name) (All [anchor expression directive] @@ -217,7 +226,7 @@ (#try.Success (get@ #descriptor.registry descriptor))))] (case (artifact.remember _name registry) #.None - (exception.throw ..unknown-definition name) + (exception.throw ..unknown-definition [name (artifact.definitions registry)]) (#.Some id) (#try.Success [stateE [_module id]])))))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/function.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/function.lux index a4b94ec4e..6bf5fcf06 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/function.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/function.lux @@ -44,7 +44,7 @@ (do ///.monad [functionT (///extension.lift macro.expected-type)] (loop [expectedT functionT] - (/.with-stack cannot-analyse [expectedT function-name arg-name body] + (/.with-stack ..cannot-analyse [expectedT function-name arg-name body] (case expectedT (#.Named name unnamedT) (recur unnamedT) @@ -102,7 +102,7 @@ (def: #export (apply analyse argsC+ functionT functionA archive functionC) (-> Phase (List Code) Type Analysis Phase) - (<| (/.with-stack cannot-apply [functionT functionC argsC+]) + (<| (/.with-stack ..cannot-apply [functionT functionC argsC+]) (do ///.monad [[applyT argsA+] (//inference.general archive analyse functionT argsC+)]) (wrap (/.apply [functionA argsA+])))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/inference.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/inference.lux index 9a1e07d7a..76315bb6c 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/inference.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/inference.lux @@ -157,7 +157,7 @@ (#.Function inputT outputT) (do ///.monad [[outputT' args'A] (general archive analyse outputT args') - argA (<| (/.with-stack cannot-infer-argument [inputT argC]) + argA (<| (/.with-stack ..cannot-infer-argument [inputT argC]) (//type.with-type inputT) (analyse archive argC))] (wrap [outputT' (list& argA args'A)])) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/module.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/module.lux index 1764dfdd6..9fae1fa1e 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/module.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/module.lux @@ -144,11 +144,10 @@ (-> Nat Text (Operation Any)) (///extension.lift (function (_ state) - (let [module (new hash)] - (#try.Success [(update@ #.modules - (plist.put name module) - state) - []]))))) + (#try.Success [(update@ #.modules + (plist.put name (new hash)) + state) + []])))) (def: #export (with-module hash name action) (All [a] (-> Nat Text (Operation a) (Operation [Module a]))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/structure.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/structure.lux index cd07f23c4..8d3c03628 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/structure.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/analysis/structure.lux @@ -94,7 +94,7 @@ [expectedT (///extension.lift macro.expected-type) expectedT' (//type.with-env (check.clean expectedT))] - (/.with-stack cannot-analyse-variant [expectedT' tag valueC] + (/.with-stack ..cannot-analyse-variant [expectedT' tag valueC] (case expectedT (#.Sum _) (let [flat (type.flatten-variant expectedT) @@ -199,7 +199,7 @@ (-> Archive Phase (List Code) (Operation Analysis)) (do ///.monad [expectedT (///extension.lift macro.expected-type)] - (/.with-stack cannot-analyse-tuple [expectedT membersC] + (/.with-stack ..cannot-analyse-tuple [expectedT membersC] (case expectedT (#.Product _) (..typed-product archive analyse membersC) diff --git a/stdlib/source/lux/tool/compiler/meta/archive.lux b/stdlib/source/lux/tool/compiler/meta/archive.lux index a7e1ffe16..edab30124 100644 --- a/stdlib/source/lux/tool/compiler/meta/archive.lux +++ b/stdlib/source/lux/tool/compiler/meta/archive.lux @@ -5,7 +5,8 @@ ["." monad (#+ do)]] [control ["." try (#+ Try)] - ["ex" exception (#+ exception:)]] + ["." exception (#+ exception:)] + ["." function]] [data ["." name] ["." text] @@ -21,15 +22,19 @@ ["." descriptor (#+ Module Descriptor)] ["." document (#+ Document)]]) -(exception: #export (unknown-document {module Module}) - (ex.report ["Module" module])) +(exception: #export (unknown-document {module Module} + {known-modules (List Module)}) + (exception.report + ["Module" module] + ["Known Modules" (exception.enumerate function.identity known-modules)])) (exception: #export (cannot-replace-document {module Module} {old (Document Any)} {new (Document Any)}) - (ex.report ["Module" module] - ["Old key" (signature.description (document.signature old))] - ["New key" (signature.description (document.signature new))])) + (exception.report + ["Module" module] + ["Old key" (signature.description (document.signature old))] + ["New key" (signature.description (document.signature new))])) (abstract: #export Archive {} @@ -46,7 +51,7 @@ (#.Some [existing-descriptor existing-document]) (if (is? document existing-document) (#try.Success archive) - (ex.throw cannot-replace-document [module existing-document document])) + (exception.throw cannot-replace-document [module existing-document document])) #.None (#try.Success (|> archive @@ -61,7 +66,8 @@ (#try.Success document) #.None - (ex.throw unknown-document [module]))) + (exception.throw ..unknown-document [module + (dictionary.keys (:representation archive))]))) (def: #export (archived? archive module) (-> Archive Module Bit) diff --git a/stdlib/source/lux/tool/compiler/meta/archive/artifact.lux b/stdlib/source/lux/tool/compiler/meta/archive/artifact.lux index 534749ace..256c10a22 100644 --- a/stdlib/source/lux/tool/compiler/meta/archive/artifact.lux +++ b/stdlib/source/lux/tool/compiler/meta/archive/artifact.lux @@ -3,6 +3,7 @@ [data ["." text] [collection + ["." list] ["." row (#+ Row)] ["." dictionary (#+ Dictionary)]]] [type @@ -46,8 +47,17 @@ (update@ #next inc) (update@ #artifacts (row.add {#id id #name (#.Some name)})) + (update@ #resolver (dictionary.put name id)) :abstraction)])) + (def: #export (definitions registry) + (-> Registry (List Text)) + (|> registry + :representation + (get@ #artifacts) + row.to-list + (list.search-all (get@ #name)))) + (def: #export (remember name registry) (-> Text Registry (Maybe ID)) (|> (:representation registry) diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux index 886582c34..371dbdec7 100644 --- a/stdlib/source/program/compositor.lux +++ b/stdlib/source/program/compositor.lux @@ -37,7 +37,7 @@ ["." syntax] ["." analysis [macro (#+ Expander)]] - ["." generation] + ["." generation (#+ Buffer)] ["." directive] [phase [extension (#+ Extender)]]]] @@ -46,8 +46,8 @@ [descriptor (#+ Module)]]]] ## ["." interpreter] ]] - [/ - ["." cli (#+ Service)]]) + ["." / #_ + ["#." cli (#+ Service)]]) (def: (or-crash! failure-description action) (All [a] @@ -90,7 +90,7 @@ ## (promise@wrap (#try.Failure error))))) (def: #export (compiler target partial-host-extension - expander host-analysis platform host module generation-bundle host-directive-bundle program extender + expander host-analysis platform host generation-bundle host-directive-bundle program extender service packager,package) (All [] @@ -100,7 +100,6 @@ analysis.Bundle (IO (Platform )) Host - Module (generation.Bundle ) (directive.Bundle ) (-> expression artifact) @@ -114,14 +113,15 @@ promise.future (:: @ map (|>> try.assume console.async)))] (case service - (#cli.Compilation configuration) + (#/cli.Compilation configuration) (<| (or-crash! "Compilation failed:") (do (try.with promise.monad) - [state (:share [] - {(Platform ) - platform} - {(Promise (Try (directive.State+ ))) - (platform.initialize target host module expander host-analysis platform generation-bundle host-directive-bundle program extender)}) + [[state runtime-buffer] (:share [] + {(Platform ) + platform} + {(Promise (Try [(directive.State+ ) + (Buffer artifact)])) + (platform.initialize target host (get@ #/cli.module configuration) expander host-analysis platform generation-bundle host-directive-bundle program extender)}) [archive state] (:share [] {(Platform ) platform} @@ -132,7 +132,7 @@ ] (wrap (log! "Compilation complete!")))) - (#cli.Interpretation configuration) + (#/cli.Interpretation configuration) ## TODO: Fix the interpreter... (undefined) ## (<| (or-crash! "Interpretation failed:") -- cgit v1.2.3