From f27a91a7b67790272578692ea20e2d875dbb3d35 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 23 Feb 2022 05:30:53 -0400 Subject: ADDED Can pass config parameters to compiler and select code based on it. Can also select code based on compiler version. --- changelog.md | 3 + lux-bootstrapper/src/lux/base.clj | 9 +- stdlib/source/library/lux.lux | 16 +-- .../lux/data/collection/dictionary/plist.lux | 37 ++++--- stdlib/source/library/lux/meta.lux | 16 ++- stdlib/source/library/lux/meta/configuration.lux | 103 ++++++++++++++++++++ stdlib/source/library/lux/meta/version.lux | 47 +++++++++ .../library/lux/tool/compiler/default/init.lux | 9 +- .../library/lux/tool/compiler/default/platform.lux | 13 +-- .../library/lux/tool/compiler/language/lux.lux | 7 +- .../lux/tool/compiler/language/lux/analysis.lux | 10 +- .../language/lux/phase/generation/jvm/host.lux | 3 - .../language/lux/phase/generation/jvm/runtime.lux | 5 +- .../lux/tool/compiler/language/lux/version.lux | 9 -- .../source/library/lux/tool/compiler/meta/cli.lux | 10 +- .../library/lux/tool/compiler/meta/io/archive.lux | 30 +++--- .../lux/tool/compiler/meta/packager/ruby.lux | 3 - stdlib/source/program/aedifex/command/build.lux | 15 ++- stdlib/source/program/aedifex/command/deploy.lux | 107 +++++++++++---------- stdlib/source/program/aedifex/command/install.lux | 87 ++++++++--------- stdlib/source/program/aedifex/command/version.lux | 31 +++--- .../program/aedifex/dependency/resolution.lux | 5 +- stdlib/source/program/aedifex/format.lux | 3 +- stdlib/source/program/aedifex/hash.lux | 44 ++++----- stdlib/source/program/aedifex/parser.lux | 26 +++-- stdlib/source/program/aedifex/profile.lux | 15 ++- .../source/program/aedifex/repository/identity.lux | 23 ++--- .../source/program/aedifex/repository/remote.lux | 61 ++++++------ stdlib/source/program/compositor.lux | 4 +- stdlib/source/test/lux/macro.lux | 5 +- stdlib/source/test/lux/macro/syntax/definition.lux | 5 +- stdlib/source/test/lux/meta.lux | 51 ++++++---- stdlib/source/test/lux/meta/configuration.lux | 90 +++++++++++++++++ stdlib/source/test/lux/meta/version.lux | 55 +++++++++++ .../lux/tool/compiler/language/lux/analysis.lux | 20 ++-- .../compiler/language/lux/analysis/inference.lux | 7 +- .../tool/compiler/language/lux/analysis/macro.lux | 11 ++- .../tool/compiler/language/lux/analysis/module.lux | 11 ++- .../tool/compiler/language/lux/analysis/type.lux | 8 +- .../language/lux/phase/analysis/complex.lux | 7 +- .../language/lux/phase/analysis/simple.lux | 8 +- stdlib/source/test/lux/tool/compiler/meta/cli.lux | 16 ++- 42 files changed, 719 insertions(+), 326 deletions(-) create mode 100644 stdlib/source/library/lux/meta/configuration.lux create mode 100644 stdlib/source/library/lux/meta/version.lux delete mode 100644 stdlib/source/library/lux/tool/compiler/language/lux/version.lux create mode 100644 stdlib/source/test/lux/meta/configuration.lux create mode 100644 stdlib/source/test/lux/meta/version.lux diff --git a/changelog.md b/changelog.md index 74d4372dc..688793326 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,9 @@ ## [Un-released] ### Added * Inline functions. +* Can pass configuration parameters from the build description to the compiler. +* Can select code based on configuration parameters. +* Can select code based on compiler version. ### Changed ### Removed ### Fixed diff --git a/lux-bootstrapper/src/lux/base.clj b/lux-bootstrapper/src/lux/base.clj index 42172b836..1cc169c28 100644 --- a/lux-bootstrapper/src/lux/base.clj +++ b/lux-bootstrapper/src/lux/base.clj @@ -140,7 +140,8 @@ (deftuple ["target" "version" - "mode"]) + "mode" + "configuration"]) ;; Hosts (defvariant @@ -229,7 +230,7 @@ (def ^:const module-class-name "_") (def ^:const +name-separator+ ".") -(def ^:const ^String version "0.6.0") +(def ^:const ^String version "00.07.00") ;; Constructors (def empty-location (T ["" -1 -1])) @@ -832,7 +833,9 @@ ;; version version ;; mode - mode] + mode + ;; configuration + $End] )) (defn init-state [name mode host-data] diff --git a/stdlib/source/library/lux.lux b/stdlib/source/library/lux.lux index 69f555fee..20122f66c 100644 --- a/stdlib/source/library/lux.lux +++ b/stdlib/source/library/lux.lux @@ -566,9 +566,10 @@ ... (type: .public Info ... (Record -... [#target Text -... #version Text -... #mode Mode])) +... [#target Text +... #version Text +... #mode Mode +... #configuration (List [Text Text])])) ("lux def type tagged" Info {#Named [..prelude_module "Info"] {#Product @@ -577,9 +578,12 @@ {#Product ... version Text - ... mode - Mode}}} - ["#target" "#version" "#mode"] + {#Product + ... mode + Mode + ... configuration + {#Apply {#Product Text Text} List}}}}} + ["#target" "#version" "#mode" "#configuration"] .public) ... (type: .public Lux diff --git a/stdlib/source/library/lux/data/collection/dictionary/plist.lux b/stdlib/source/library/lux/data/collection/dictionary/plist.lux index d646287c8..7eb2f4001 100644 --- a/stdlib/source/library/lux/data/collection/dictionary/plist.lux +++ b/stdlib/source/library/lux/data/collection/dictionary/plist.lux @@ -1,16 +1,17 @@ (.using - [library - [lux "*" - [abstract - [equivalence {"+" Equivalence}]] - [data - ["[0]" product] - ["[0]" text ("[1]#[0]" equivalence)] - [collection - ["[0]" list ("[1]#[0]" functor)]]] - [math - [number - ["n" nat]]]]]) + [library + [lux "*" + [abstract + [equivalence {"+" Equivalence}] + [monoid {"+" Monoid}]] + [data + ["[0]" product] + ["[0]" text ("[1]#[0]" equivalence)] + [collection + ["[0]" list ("[1]#[0]" functor mix)]]] + [math + [number + ["n" nat]]]]]) ... https://en.wikipedia.org/wiki/Property_list (type: .public (PList a) @@ -97,3 +98,15 @@ (All (_ a) (-> (Equivalence a) (Equivalence (PList a)))) (|>> (product.equivalence text.equivalence) list.equivalence)) + +(implementation: .public monoid + (All (_ a) (Monoid (PList a))) + + (def: identity + ..empty) + + (def: (composite left right) + (list#mix (function (_ [key val] it) + (..has key val it)) + right + left))) diff --git a/stdlib/source/library/lux/meta.lux b/stdlib/source/library/lux/meta.lux index d16ca46b9..8bf80bce5 100644 --- a/stdlib/source/library/lux/meta.lux +++ b/stdlib/source/library/lux/meta.lux @@ -665,8 +665,14 @@ {try.#Failure error} {try.#Success [lux {try.#Failure error}]}))) -(def: .public target - (Meta Text) - (function (_ lux) - {try.#Success [lux - (value@ [.#info .#target] lux)]})) +(template [ ] + [(def: .public + (Meta ) + (function (_ lux) + {try.#Success [lux + (value@ [.#info ] lux)]}))] + + [Text target .#target] + [Text version .#version] + [(List [Text Text]) configuration .#configuration] + ) diff --git a/stdlib/source/library/lux/meta/configuration.lux b/stdlib/source/library/lux/meta/configuration.lux new file mode 100644 index 000000000..057466051 --- /dev/null +++ b/stdlib/source/library/lux/meta/configuration.lux @@ -0,0 +1,103 @@ +(.using + [library + [lux {"-" for} + ["[0]" meta] + [abstract + [equivalence {"+" Equivalence}] + [monoid {"+" Monoid}] + [monad {"+" do}]] + [control + ["[0]" maybe ("[1]#[0]" functor)] + ["[0]" exception {"+" exception:}] + ["<>" parser + ["<[0]>" text {"+" Parser}] + ["<[0]>" code]]] + [data + ["[0]" text ("[1]#[0]" equivalence) + ["%" format]] + [collection + ["[0]" list ("[1]#[0]" functor mix)] + [dictionary + ["/" plist]]]] + [macro + [syntax {"+" syntax:}] + ["[0]" code]] + [math + [number {"+" hex}]]]]) + +(type: .public Configuration + (/.PList Text)) + +(def: .public equivalence + (Equivalence Configuration) + (/.equivalence text.equivalence)) + +(def: .public monoid + (Monoid Configuration) + /.monoid) + +(def: .public empty + Configuration + /.empty) + +(template [ ] + [(def: + Text + (text.of_char (hex )))] + + ["02" start] + ["03" end] + ) + +(def: format' + (-> Text Text) + (text.enclosed [..start ..end])) + +(def: .public format + (%.Format Configuration) + (|>> (list#each (function (_ [feature value]) + (%.format (..format' feature) (..format' value)))) + text.together)) + +(def: .public parser + (Parser Configuration) + (let [parser' (: (Parser Text) + (<| (<>.after (.this ..start)) + (<>.before (.this ..end)) + (.slice (.some! (.none_of! ..end)))))] + (<>.some (<>.and parser' parser')))) + +(exception: .public invalid) + +(def: configuration + (.Parser Configuration) + (.tuple (<>.some (<>.and .text .text)))) + +(def: (subsumes? actual expected) + (-> Configuration Configuration Bit) + (case expected + {.#End} + true + + {.#Item [feature value] tail} + (and (|> actual + (/.value feature) + (maybe#each (text#= value)) + (maybe.else false)) + (subsumes? expected tail)))) + +(syntax: .public (for [specializations (.tuple (<>.some (<>.and ..configuration .any))) + default (<>.maybe .any)]) + (do meta.monad + [actual meta.configuration] + (case (list#mix (function (_ [expected then] choice) + (if (subsumes? actual expected) + {.#Some then} + choice)) + default + specializations) + {.#Some it} + (in (list it)) + + {.#None} + (meta.failure (exception.error ..invalid []))))) diff --git a/stdlib/source/library/lux/meta/version.lux b/stdlib/source/library/lux/meta/version.lux new file mode 100644 index 000000000..66bf8e6f5 --- /dev/null +++ b/stdlib/source/library/lux/meta/version.lux @@ -0,0 +1,47 @@ +(.using + [library + [lux {"-" for} + ["[0]" meta] + [abstract + [monad {"+" do}]] + [control + ["[0]" exception {"+" exception:}] + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text ("[1]#[0]" equivalence)] + [collection + ["[0]" list ("[1]#[0]" mix)]]] + [macro + [syntax {"+" syntax:}] + ["[0]" code]] + [tool + [compiler + [version {"+" Version}]]]]]) + +(def: .public latest + Version + 00,06,06) + +(syntax: .public (current []) + (do meta.monad + [it meta.version] + (in (list (code.text it))))) + +(exception: .public invalid) + +(syntax: .public (for [specializations (.tuple (<>.some (<>.and .text .any))) + default (<>.maybe .any)]) + (do meta.monad + [current meta.version] + (case (list#mix (function (_ [when then] choice) + (if (text#= when current) + {.#Some then} + choice)) + default + specializations) + {.#Some it} + (in (list it)) + + {.#None} + (meta.failure (exception.error ..invalid []))))) diff --git a/stdlib/source/library/lux/tool/compiler/default/init.lux b/stdlib/source/library/lux/tool/compiler/default/init.lux index fc7e1b637..7f815abf9 100644 --- a/stdlib/source/library/lux/tool/compiler/default/init.lux +++ b/stdlib/source/library/lux/tool/compiler/default/init.lux @@ -18,6 +18,9 @@ ["[0]" dictionary] ["[0]" set] ["[0]" sequence ("[1]#[0]" functor)]]] + [meta + ["[0]" configuration {"+" Configuration}] + ["[0]" version]] [world ["[0]" file]]]] ["[0]" // "_" @@ -26,7 +29,6 @@ [language [lux [program {"+" Program}] - ["[1][0]" version] ["[1][0]" syntax {"+" Aliases}] ["[1][0]" synthesis] ["[1][0]" directive {"+" Requirements}] @@ -51,10 +53,11 @@ ["[0]" descriptor] ["[0]" document]]]]]]) -(def: .public (state target module expander host_analysis host generate generation_bundle) +(def: .public (state target module configuration expander host_analysis host generate generation_bundle) (All (_ anchor expression directive) (-> Target descriptor.Module + Configuration Expander ///analysis.Bundle (///generation.Host expression directive) @@ -65,7 +68,7 @@ generation_state [generation_bundle (///generation.state host module)] eval (///analysis/evaluation.evaluator expander synthesis_state generation_state generate) analysis_state [(analysisE.bundle eval host_analysis) - (///analysis.state (///analysis.info ///version.version target))]] + (///analysis.state (///analysis.info version.latest target configuration))]] [extension.empty [///directive.#analysis [///directive.#state analysis_state ///directive.#phase (analysisP.phase expander)] diff --git a/stdlib/source/library/lux/tool/compiler/default/platform.lux b/stdlib/source/library/lux/tool/compiler/default/platform.lux index 2ddc8a689..f489c1fb8 100644 --- a/stdlib/source/library/lux/tool/compiler/default/platform.lux +++ b/stdlib/source/library/lux/tool/compiler/default/platform.lux @@ -3,7 +3,6 @@ [lux "*" ["@" target] ["[0]" debug] - ["[0]" meta] [abstract ["[0]" monad {"+" Monad do}]] [control @@ -27,6 +26,8 @@ ["[0]" list ("[1]#[0]" monoid functor mix)]] [format ["_" binary {"+" Writer}]]] + ["[0]" meta + ["[0]" configuration {"+" Configuration}]] [type {"+" :sharing} ["[0]" check]] [world @@ -40,7 +41,6 @@ [lux [program {"+" Program}] ["$" /] - ["[1][0]" version] ["[0]" syntax] ["[1][0]" synthesis] ["[1][0]" generation {"+" Buffer}] @@ -240,7 +240,7 @@ (dictionary.merged directives (host_directive_bundle phase_wrapper))]) (def: .public (initialize context module expander host_analysis platform generation_bundle host_directive_bundle program anchorT,expressionT,directiveT extender - import compilation_sources) + import compilation_sources compilation_configuration) (All (_ ) (-> Context descriptor.Module @@ -251,18 +251,19 @@ (-> ///phase.Wrapper (///directive.Bundle )) (Program expression directive) [Type Type Type] (-> ///phase.Wrapper Extender) - Import (List _io.Context) + Import (List _io.Context) Configuration (Async (Try [ Archive ///phase.Wrapper])))) (do [! (try.with async.monad)] [.let [state (//init.state (value@ context.#host context) module + compilation_configuration expander host_analysis (value@ #host platform) (value@ #phase platform) generation_bundle)] _ (cache.enable! (value@ #&file_system platform) context) - [archive analysis_state bundles] (ioW.thaw (value@ #host platform) (value@ #&file_system platform) context import compilation_sources) + [archive analysis_state bundles] (ioW.thaw compilation_configuration (value@ #host platform) (value@ #&file_system platform) context import compilation_sources) .let [with_missing_extensions (: (All (_ ) (-> (Program expression directive) @@ -753,7 +754,7 @@ (def: .public (compile phase_wrapper import file_context expander platform compilation context) (All (_ ) (-> ///phase.Wrapper Import Context Expander Compilation )) - (let [[host_dependencies libraries compilers sources target module] compilation + (let [[host_dependencies libraries compilers sources target module configuration] compilation importer (|> (..compiler phase_wrapper expander platform) (serial_compiler import file_context platform sources) (..parallel context))] diff --git a/stdlib/source/library/lux/tool/compiler/language/lux.lux b/stdlib/source/library/lux/tool/compiler/language/lux.lux index 566a7afa9..faf7f3b90 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux.lux @@ -6,9 +6,10 @@ ["" binary {"+" Parser}]]] [data [format - ["_" binary {"+" Writer}]]]]] + ["_" binary {"+" Writer}]]] + [meta + ["[0]" version]]]] ["[0]" / "_" - ["[1][0]" version] [analysis ["[0]" module]] [/// @@ -86,5 +87,5 @@ (def: .public key (Key .Module) (key.key [signature.#name (symbol ..compiler) - signature.#version /version.version] + signature.#version version.latest] (module.empty 0))) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/analysis.lux b/stdlib/source/library/lux/tool/compiler/language/lux/analysis.lux index 5ac2fda49..650842124 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/analysis.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/analysis.lux @@ -28,7 +28,8 @@ ["r" rev] ["f" frac]]] [meta - ["[0]" location]]]] + ["[0]" location] + ["[0]" configuration {"+" Configuration}]]]] ["[0]" / "_" ["[1][0]" simple {"+" Simple}] ["[1][0]" complex {"+" Tuple Variant Complex}] @@ -356,11 +357,12 @@ .#var_counter 0 .#var_bindings (list)]) -(def: .public (info version host) - (-> Version Text Info) +(def: .public (info version host configuration) + (-> Version Text Configuration Info) [.#target host .#version (version.format version) - .#mode {.#Build}]) + .#mode {.#Build} + .#configuration configuration]) (def: .public (state info) (-> Info Lux) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/host.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/host.lux index c9ad8c0eb..d4c947953 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/host.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/host.lux @@ -38,9 +38,6 @@ ["[0]" descriptor]]]] [tool [compiler - [language - [lux - [version {"+" version}]]] [meta [io {"+" lux_context}] [archive diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/runtime.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/runtime.lux index fc96c025f..6031ed1db 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/runtime.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/runtime.lux @@ -21,6 +21,8 @@ ["n" nat] ["[0]" i32] ["[0]" i64]]] + [meta + ["[0]" version]] [target ["[0]" jvm "_" ["_" bytecode {"+" Label Bytecode}] @@ -48,7 +50,6 @@ ["[1]/[0]" count]]]] ["//[1]" /// "_" [// - ["[0]" version] ["[0]" synthesis] ["[0]" generation] [/// @@ -92,7 +93,7 @@ (def: .public (class_name [module id]) (-> unit.ID Text) (format lux_context - "." (%.nat version.version) + "." (%.nat version.latest) "." (%.nat module) "." (%.nat id))) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/version.lux b/stdlib/source/library/lux/tool/compiler/language/lux/version.lux deleted file mode 100644 index cc044938c..000000000 --- a/stdlib/source/library/lux/tool/compiler/language/lux/version.lux +++ /dev/null @@ -1,9 +0,0 @@ -(.using - [library - [lux "*"]] - [//// - [version {"+" Version}]]) - -(def: .public version - Version - 00,06,06) diff --git a/stdlib/source/library/lux/tool/compiler/meta/cli.lux b/stdlib/source/library/lux/tool/compiler/meta/cli.lux index 056652661..f13f1596c 100644 --- a/stdlib/source/library/lux/tool/compiler/meta/cli.lux +++ b/stdlib/source/library/lux/tool/compiler/meta/cli.lux @@ -18,7 +18,8 @@ [math [number {"+" hex}]] [meta - ["[0]" symbol]] + ["[0]" symbol] + ["[0]" configuration {"+" Configuration}]] [tool [compiler [meta @@ -52,7 +53,8 @@ #compilers (List Compiler) #sources (List Source) #target Target - #module Module])) + #module Module + #configuration Configuration])) (type: .public Interpretation ..Compilation) @@ -77,6 +79,7 @@ [source_parser "--source" Source .any] [target_parser "--target" Target .any] [module_parser "--module" Module .any] + [configuration_parser "--configuration" Configuration (.then configuration.parser .any)] ) (def: .public service @@ -88,7 +91,8 @@ (<>.some ..compiler_parser) (<>.some ..source_parser) ..target_parser - ..module_parser))] + ..module_parser + ..configuration_parser))] ($_ <>.or (<>.after (.this "build") compiler) diff --git a/stdlib/source/library/lux/tool/compiler/meta/io/archive.lux b/stdlib/source/library/lux/tool/compiler/meta/io/archive.lux index 4693a7d2f..13e848153 100644 --- a/stdlib/source/library/lux/tool/compiler/meta/io/archive.lux +++ b/stdlib/source/library/lux/tool/compiler/meta/io/archive.lux @@ -26,6 +26,9 @@ [math [number ["n" nat]]] + [meta + ["[0]" configuration {"+" Configuration}] + ["[0]" version]] [world ["[0]" file]]]] ["[0]" // @@ -46,7 +49,6 @@ ["/[1]" // {"+" Input} [language ["$" lux - ["[0]" version] ["[0]" analysis] ["[0]" synthesis] ["[0]" generation] @@ -145,12 +147,12 @@ ..module_parser registry.parser)) -(def: (fresh_analysis_state host) - (-> Target .Lux) - (analysis.state (analysis.info version.version host))) +(def: (fresh_analysis_state host configuration) + (-> Target Configuration .Lux) + (analysis.state (analysis.info version.latest host configuration))) -(def: (analysis_state host archive) - (-> Target Archive (Try .Lux)) +(def: (analysis_state host configuration archive) + (-> Target Configuration Archive (Try .Lux)) (do [! try.monad] [modules (: (Try (List [descriptor.Module .Module])) (monad.each ! (function (_ module) @@ -161,7 +163,7 @@ (document.content $.key))] (in [module content]))) (archive.archived archive)))] - (in (with@ .#modules modules (fresh_analysis_state host))))) + (in (with@ .#modules modules (fresh_analysis_state host configuration))))) (def: (cached_artifacts fs context module_id) (-> (file.System Async) Context module.ID (Async (Try (Dictionary Text Binary)))) @@ -463,9 +465,9 @@ bundles])))))] (in it))) -(def: (load_every_reserved_module host_environment fs context import contexts archive) +(def: (load_every_reserved_module configuration host_environment fs context import contexts archive) (All (_ expression directive) - (-> (generation.Host expression directive) (file.System Async) Context Import (List //.Context) Archive + (-> Configuration (generation.Host expression directive) (file.System Async) Context Import (List //.Context) Archive (Async (Try [Archive .Lux Bundles])))) (do [! (try.with async.monad)] [pre_loaded_caches (..pre_loaded_caches fs context import contexts archive) @@ -482,7 +484,7 @@ (archive.has module entry archive)) archive loaded_caches) - analysis_state (..analysis_state (value@ context.#host context) archive)] + analysis_state (..analysis_state (value@ context.#host context) configuration archive)] (in [archive analysis_state (list#mix (function (_ [_ [+analysers +synthesizers +generators +directives]] @@ -494,9 +496,9 @@ ..empty_bundles loaded_caches)]))))) -(def: .public (thaw host_environment fs context import contexts) +(def: .public (thaw configuration host_environment fs context import contexts) (All (_ expression directive) - (-> (generation.Host expression directive) (file.System Async) Context Import (List //.Context) + (-> Configuration (generation.Host expression directive) (file.System Async) Context Import (List //.Context) (Async (Try [Archive .Lux Bundles])))) (do async.monad [binary (# fs read (..general_descriptor fs context))] @@ -504,9 +506,9 @@ {try.#Success binary} (do (try.with async.monad) [archive (async#in (archive.import ///.version binary))] - (..load_every_reserved_module host_environment fs context import contexts archive)) + (..load_every_reserved_module configuration host_environment fs context import contexts archive)) {try.#Failure error} (in {try.#Success [archive.empty - (fresh_analysis_state (value@ context.#host context)) + (fresh_analysis_state (value@ context.#host context) configuration) ..empty_bundles]})))) diff --git a/stdlib/source/library/lux/tool/compiler/meta/packager/ruby.lux b/stdlib/source/library/lux/tool/compiler/meta/packager/ruby.lux index 1bfd062fe..fb4d43410 100644 --- a/stdlib/source/library/lux/tool/compiler/meta/packager/ruby.lux +++ b/stdlib/source/library/lux/tool/compiler/meta/packager/ruby.lux @@ -25,9 +25,6 @@ ["_" ruby]] [world ["[0]" file]]]] - [program - [compositor - ["[0]" static {"+" Static}]]] ["[0]" // {"+" Packager} [// ["[0]" archive {"+" Output} diff --git a/stdlib/source/program/aedifex/command/build.lux b/stdlib/source/program/aedifex/command/build.lux index 8570207be..599887fe4 100644 --- a/stdlib/source/program/aedifex/command/build.lux +++ b/stdlib/source/program/aedifex/command/build.lux @@ -6,7 +6,7 @@ [order {"+" Order}] [monad {"+" do}]] [control - ["[0]" try {"+" Try}] + ["[0]" try {"+" Try} ("[1]#[0]" functor)] ["[0]" exception {"+" exception:}] ["[0]" io {"+" IO}] [concurrency @@ -23,10 +23,13 @@ [number {"+" hex} ["n" nat] ["i" int]]] + [meta + ["[0]" configuration]] [tool [compiler [meta - ["[0]" cli] + [cli + ["[0]" compiler]] ["[0]" packager ["[0]_[1]" ruby]]]]] [world @@ -238,8 +241,9 @@ (def: windows? Bit - (|> (java/lang/System::getProperty "os.name") + (|> (java/lang/System::getProperty (ffi.as_string "os.name")) io.run! + (try#each (|>> ffi.of_string)) (try.else "") text.lower_cased (text.starts_with? "windows"))) @@ -306,10 +310,11 @@ (list "build") (..plural "--library" (..libraries fs home resolution)) (..plural "--host_dependency" host_dependencies) - (..plural "--compiler" (list#each cli.compiler_format (value@ ///.#compilers profile))) + (..plural "--compiler" (list#each compiler.format (value@ ///.#compilers profile))) (..plural "--source" (set.list (value@ ///.#sources profile))) (..singular "--target" cache_directory) - (..singular "--module" program_module)))] + (..singular "--module" program_module) + (..singular "--configuration" (configuration.format (value@ ///.#configuration profile)))))] process (# shell execute [environment working_directory command diff --git a/stdlib/source/program/aedifex/command/deploy.lux b/stdlib/source/program/aedifex/command/deploy.lux index f80ed0275..3ceefa7c1 100644 --- a/stdlib/source/program/aedifex/command/deploy.lux +++ b/stdlib/source/program/aedifex/command/deploy.lux @@ -1,57 +1,58 @@ (.using - [library - [lux "*" - [abstract - [monad {"+" do}]] - [control - [pipe {"+" do>}] - ["[0]" try {"+" Try}] - [concurrency - ["[0]" async {"+" Async} ("[1]#[0]" monad)]] - ["<>" parser - ["<[0]>" xml]]] - [data - [binary {"+" Binary}] - [text - ["%" format {"+" format}] - [encoding - ["[0]" utf8]]] - [collection - ["[0]" set]] - [format - ["[0]" binary] - ["[0]" tar] - ["[0]" xml]]] - [time - ["[0]" instant {"+" Instant}]] - [world - ["[0]" file] - ["[0]" console {"+" Console}]]]] - [program - [compositor - ["[0]" export]]] - ["[0]" // "_" - ["[1][0]" clean] - ["/[1]" // "_" - [command {"+" Command}] - ["/" profile] - ["[1][0]" action {"+" Action}] - ["[1][0]" pom] - ["[1][0]" hash] - ["[1][0]" package] - ["[1][0]" dependency - ["[1]/[0]" deployment] - ["[1]/[0]" status {"+" Status}]] - ["[1][0]" repository {"+" Repository} - [identity {"+" Identity}] - ["[1]/[0]" remote] - ["[1]/[0]" origin]] - ["[1][0]" metadata - ["[1]/[0]" artifact] - ["[1]/[0]" snapshot]] - ["[1][0]" artifact {"+" Artifact} - ["[1]/[0]" extension {"+" Extension}] - ["[1]/[0]" type]]]]) + [library + [lux "*" + [abstract + [monad {"+" do}]] + [control + [pipe {"+" do>}] + ["[0]" try {"+" Try}] + [concurrency + ["[0]" async {"+" Async} ("[1]#[0]" monad)]] + ["<>" parser + ["<[0]>" xml]]] + [data + [binary {"+" Binary}] + [text + ["%" format {"+" format}] + [encoding + ["[0]" utf8]]] + [collection + ["[0]" set]] + [format + ["[0]" binary] + ["[0]" tar] + ["[0]" xml]]] + [time + ["[0]" instant {"+" Instant}]] + [tool + [compiler + [meta + ["[0]" export]]]] + [world + ["[0]" file] + ["[0]" console {"+" Console}]]]] + ["[0]" // "_" + ["[1][0]" clean] + ["/[1]" // "_" + [command {"+" Command}] + ["/" profile] + ["[1][0]" action {"+" Action}] + ["[1][0]" pom] + ["[1][0]" hash] + ["[1][0]" package] + ["[1][0]" dependency + ["[1]/[0]" deployment] + ["[1]/[0]" status {"+" Status}]] + ["[1][0]" repository {"+" Repository} + [identity {"+" Identity}] + ["[1]/[0]" remote] + ["[1]/[0]" origin]] + ["[1][0]" metadata + ["[1]/[0]" artifact] + ["[1]/[0]" snapshot]] + ["[1][0]" artifact {"+" Artifact} + ["[1]/[0]" extension {"+" Extension}] + ["[1]/[0]" type]]]]) (def: .public success "Successfully deployed the project.") diff --git a/stdlib/source/program/aedifex/command/install.lux b/stdlib/source/program/aedifex/command/install.lux index 06f3197f8..a1553e4bd 100644 --- a/stdlib/source/program/aedifex/command/install.lux +++ b/stdlib/source/program/aedifex/command/install.lux @@ -1,47 +1,48 @@ (.using - [library - [lux "*" - [abstract - [monad {"+" do}]] - [control - ["[0]" try {"+" Try}] - ["[0]" exception] - [concurrency - ["[0]" async {"+" Async}]]] - [data - [binary {"+" Binary}] - [text - [encoding - ["[0]" utf8]]] - [collection - ["[0]" set]] - [format - ["[0]" binary] - ["[0]" tar] - ["[0]" xml]]] - [world - [program {"+" Program}] - ["[0]" file] - ["[0]" console {"+" Console}]]]] - [program - [compositor - ["[0]" export]]] - ["[0]" // "_" - ["[1][0]" clean] - ["/[1]" // "_" - ["/" profile {"+" Profile}] - ["[1][0]" action {"+" Action}] - ["[1][0]" command {"+" Command}] - ["[1][0]" local] - ["[1][0]" pom] - ["[1][0]" package] - [repository {"+" Repository} - ["[1][0]" origin]] - ["[1][0]" dependency "_" - ["[1]/[0]" deployment] - ["[1]/[0]" status]] - ["[1][0]" artifact {"+" Artifact} - ["[1]/[0]" type]]]]) + [library + [lux "*" + [abstract + [monad {"+" do}]] + [control + ["[0]" try {"+" Try}] + ["[0]" exception] + [concurrency + ["[0]" async {"+" Async}]]] + [data + [binary {"+" Binary}] + [text + [encoding + ["[0]" utf8]]] + [collection + ["[0]" set]] + [format + ["[0]" binary] + ["[0]" tar] + ["[0]" xml]]] + [tool + [compiler + [meta + ["[0]" export]]]] + [world + [program {"+" Program}] + ["[0]" file] + ["[0]" console {"+" Console}]]]] + ["[0]" // "_" + ["[1][0]" clean] + ["/[1]" // "_" + ["/" profile {"+" Profile}] + ["[1][0]" action {"+" Action}] + ["[1][0]" command {"+" Command}] + ["[1][0]" local] + ["[1][0]" pom] + ["[1][0]" package] + [repository {"+" Repository} + ["[1][0]" origin]] + ["[1][0]" dependency "_" + ["[1]/[0]" deployment] + ["[1]/[0]" status]] + ["[1][0]" artifact {"+" Artifact} + ["[1]/[0]" type]]]]) (def: .public success "Successfully installed the project locally.") diff --git a/stdlib/source/program/aedifex/command/version.lux b/stdlib/source/program/aedifex/command/version.lux index 2a9072c39..c61e796df 100644 --- a/stdlib/source/program/aedifex/command/version.lux +++ b/stdlib/source/program/aedifex/command/version.lux @@ -1,21 +1,20 @@ (.using - [library - [lux "*" - [control - [concurrency - ["[0]" async {"+" Async}]]] - [tool - [compiler - ["[0]" version] - ["[0]" language "_" - ["[1]/[0]" lux "_" - ["[1]" version]]]]] - [world - ["[0]" console {"+" Console}]]]] - [/// - [command {"+" Command}]]) + [library + [lux "*" + [control + [concurrency + ["[0]" async {"+" Async}]]] + ["[0]" meta "_" + ["[1]/[0]" version]] + [tool + [compiler + ["[0]" version]]] + [world + ["[0]" console {"+" Console}]]]] + [/// + [command {"+" Command}]]) (def: .public (do! console profile) (-> (Console Async) (Command Any)) - (console.write_line (version.format language/lux.version) + (console.write_line (version.format meta/version.latest) console)) diff --git a/stdlib/source/program/aedifex/dependency/resolution.lux b/stdlib/source/program/aedifex/dependency/resolution.lux index ffea5d458..627a3e6ef 100644 --- a/stdlib/source/program/aedifex/dependency/resolution.lux +++ b/stdlib/source/program/aedifex/dependency/resolution.lux @@ -86,10 +86,7 @@ (case ?actual {try.#Success actual} (in (do [! try.monad] - [output (# ! each (for [@.old (|>> (:as java/lang/String) - java/lang/String::trim - (:as Text)) - @.jvm (|>> java/lang/String::trim)]) + [output (# ! each (|>> ffi.as_string java/lang/String::trim ffi.of_string) (# utf8.codec decoded actual)) actual (|> output (text.all_split_by " ") diff --git a/stdlib/source/program/aedifex/format.lux b/stdlib/source/program/aedifex/format.lux index 54e1ed57f..d0628f160 100644 --- a/stdlib/source/program/aedifex/format.lux +++ b/stdlib/source/program/aedifex/format.lux @@ -13,7 +13,8 @@ [tool [compiler [meta - [cli {"+" Compiler}]]]]]] + [cli + [compiler {"+" Compiler}]]]]]]] ["[0]" // "_" ["/" profile] ["[1][0]" runtime {"+" Runtime}] diff --git a/stdlib/source/program/aedifex/hash.lux b/stdlib/source/program/aedifex/hash.lux index 093f5fbe4..30b0cdcee 100644 --- a/stdlib/source/program/aedifex/hash.lux +++ b/stdlib/source/program/aedifex/hash.lux @@ -1,25 +1,25 @@ (.using - [library - [lux "*" - ["[0]" ffi {"+" import:}] - [abstract - [codec {"+" Codec}] - [equivalence {"+" Equivalence}] - [monad {"+" do}]] - [control - ["[0]" try {"+" Try}] - ["[0]" exception {"+" exception:}]] - [data - ["[0]" binary {"+" Binary}] - ["[0]" text - ["%" format {"+" Format format}] - ["[0]" encoding]]] - [math - [number - ["n" nat] - ["[0]" i64]]] - [type - abstract]]]) + [library + [lux "*" + ["[0]" ffi {"+" import:}] + [abstract + [codec {"+" Codec}] + [equivalence {"+" Equivalence}] + [monad {"+" do}]] + [control + ["[0]" try {"+" Try}] + ["[0]" exception {"+" exception:}]] + [data + ["[0]" binary {"+" Binary}] + ["[0]" text + ["%" format {"+" Format format}] + ["[0]" encoding]]] + [math + [number + ["n" nat] + ["[0]" i64]]] + [type + abstract]]]) ... TODO: Replace with pure-Lux implementations of these algorithms ... https://en.wikipedia.org/wiki/SHA-1#SHA-1_pseudocode @@ -44,7 +44,7 @@ (template [ ] [(def: .public ( value) (-> Binary (Hash )) - (|> (java/security/MessageDigest::getInstance []) + (|> (java/security/MessageDigest::getInstance [(ffi.as_string )]) (java/security/MessageDigest::digest [value]) :abstraction))] diff --git a/stdlib/source/program/aedifex/parser.lux b/stdlib/source/program/aedifex/parser.lux index 52a9a292c..097373529 100644 --- a/stdlib/source/program/aedifex/parser.lux +++ b/stdlib/source/program/aedifex/parser.lux @@ -9,12 +9,14 @@ [data ["[0]" text] [collection - ["[0]" dictionary {"+" Dictionary}] - ["[0]" set {"+" Set}]]] + ["[0]" set {"+" Set}] + ["[0]" dictionary {"+" Dictionary} + ["[0]" plist {"+" PList}]]]] [tool [compiler [meta - [cli {"+" Compiler}] + [cli + [compiler {"+" Compiler}]] [archive [module [descriptor {"+" Module}]]]]]] @@ -179,10 +181,14 @@ .text) (def: deploy_repository - (Parser (List [Text //repository.Address])) - (.tuple (<>.some - (<>.and .text - ..repository)))) + (Parser [Text //repository.Address]) + (<>.and .text + ..repository)) + +(def: configuration/1 + (Parser [Text Text]) + (<>.and .text + .text)) (def: runtime (Parser Runtime) @@ -237,7 +243,10 @@ ^deploy_repositories (: (Parser (Dictionary Text //repository.Address)) (<| (# ! each (dictionary.of_list text.hash)) (<>.else (list)) - (..singular input "deploy_repositories" ..deploy_repository))) + (..plural input "deploy_repositories" ..deploy_repository))) + ^configuration (: (Parser (PList Text)) + (<| (<>.else (list)) + (..plural input "configuration" ..configuration/1))) ^java (|> ..runtime (..singular input "java") (<>.else //runtime.default_java)) @@ -266,6 +275,7 @@ ^program ^test ^deploy_repositories + ^configuration ^java ^js ^python diff --git a/stdlib/source/program/aedifex/profile.lux b/stdlib/source/program/aedifex/profile.lux index eeabf5f82..43887caa4 100644 --- a/stdlib/source/program/aedifex/profile.lux +++ b/stdlib/source/program/aedifex/profile.lux @@ -11,9 +11,10 @@ ["[0]" product] ["[0]" text ("[1]#[0]" equivalence)] [collection - ["[0]" dictionary {"+" Dictionary}] ["[0]" list ("[1]#[0]" monoid)] - ["[0]" set {"+" Set}]]] + ["[0]" set {"+" Set}] + ["[0]" dictionary {"+" Dictionary} + ["[0]" plist {"+" PList} ("[1]#[0]" monoid)]]]] [macro ["[0]" template]] [meta @@ -24,7 +25,8 @@ [tool [compiler [meta - ["[0]" cli {"+" Compiler}] + ["[0]" cli + ["[0]" compiler {"+" Compiler}]] [archive [module [descriptor {"+" Module}]]]]]]]] @@ -173,6 +175,7 @@ #program (Maybe Module) #test (Maybe Module) #deploy_repositories (Dictionary Text Address) + #configuration (PList Text) #java Runtime #js Runtime #python Runtime @@ -195,7 +198,7 @@ ... #lux dependency.equivalence ... #compilers - (list.equivalence cli.compiler_equivalence) + (list.equivalence compiler.equivalence) ... #sources set.equivalence ... #target @@ -206,6 +209,8 @@ (maybe.equivalence text.equivalence) ... #deploy_repositories (dictionary.equivalence text.equivalence) + ... #configuration + (plist.equivalence text.equivalence) ... #java runtime.equivalence ... #js @@ -233,6 +238,7 @@ #program {.#None} #test {.#None} #deploy_repositories (dictionary.empty text.hash) + #configuration plist.empty #java runtime.default_java #js runtime.default_js #python runtime.default_python @@ -260,6 +266,7 @@ #program (maybe#composite (value@ #program override) (value@ #program baseline)) #test (maybe#composite (value@ #test override) (value@ #test baseline)) #deploy_repositories (dictionary.merged (value@ #deploy_repositories override) (value@ #deploy_repositories baseline)) + #configuration (plist#composite (value@ #configuration override) (value@ #configuration baseline)) #java (!runtime #java runtime.default_java) #js (!runtime #js runtime.default_js) #python (!runtime #python runtime.default_python) diff --git a/stdlib/source/program/aedifex/repository/identity.lux b/stdlib/source/program/aedifex/repository/identity.lux index 6e058850d..8288f2d74 100644 --- a/stdlib/source/program/aedifex/repository/identity.lux +++ b/stdlib/source/program/aedifex/repository/identity.lux @@ -1,15 +1,15 @@ (.using - [library - [lux "*" - ["[0]" ffi {"+" import:}] - [abstract - [equivalence {"+" Equivalence}]] - [data - ["[0]" product] - ["[0]" text - ["%" format {"+" format}] - [encoding - ["[0]" utf8]]]]]]) + [library + [lux "*" + ["[0]" ffi {"+" import:}] + [abstract + [equivalence {"+" Equivalence}]] + [data + ["[0]" product] + ["[0]" text + ["%" format {"+" format}] + [encoding + ["[0]" utf8]]]]]]) (type: .public User Text) @@ -42,4 +42,5 @@ (let [credentials (# utf8.codec encoded (format user ":" password))] (|> (java/util/Base64::getEncoder) (java/util/Base64$Encoder::encodeToString credentials) + ffi.of_string (format "Basic ")))) diff --git a/stdlib/source/program/aedifex/repository/remote.lux b/stdlib/source/program/aedifex/repository/remote.lux index 9e50e71a6..7f1a735b8 100644 --- a/stdlib/source/program/aedifex/repository/remote.lux +++ b/stdlib/source/program/aedifex/repository/remote.lux @@ -1,34 +1,33 @@ (.using - [library - [lux "*" - [abstract - [monad {"+" do}]] - [control - ["[0]" io {"+" IO}] - ["[0]" try {"+" Try}] - ["[0]" exception {"+" exception:}]] - [data - ["[0]" product] - [text - ["%" format {"+" format}]]] - [tool - [compiler - ["[0]" version] - ["[0]" language "_" - ["[1]/[0]" lux "_" - ["[1]" version]]]]] - [world - [net {"+" URL} - [uri {"+" URI}] - ["[0]" http "_" - ["[1]" client] - ["[1]/[0]" status] - ["@[1]" /]]]]]] - ["[0]" // - ["[1][0]" identity {"+" Identity}] - ["/[1]" // "_" - ["[1][0]" artifact {"+" Version Artifact} - [extension {"+" Extension}]]]]) + [library + [lux "*" + [abstract + [monad {"+" do}]] + [control + ["[0]" io {"+" IO}] + ["[0]" try {"+" Try}] + ["[0]" exception {"+" exception:}]] + [data + ["[0]" product] + [text + ["%" format {"+" format}]]] + ["[0]" meta "_" + ["[1]/[0]" version]] + [tool + [compiler + ["[0]" version]]] + [world + [net {"+" URL} + [uri {"+" URI}] + ["[0]" http "_" + ["[1]" client] + ["[1]/[0]" status] + ["@[1]" /]]]]]] + ["[0]" // + ["[1][0]" identity {"+" Identity}] + ["/[1]" // "_" + ["[1][0]" artifact {"+" Version Artifact} + [extension {"+" Extension}]]]]) (type: .public Address URL) @@ -49,7 +48,7 @@ (format (///artifact.uri version_template artifact) extension)) (def: .public user_agent - (format "LuxAedifex/" (version.format language/lux.version))) + (format "LuxAedifex/" (version.format meta/version.latest))) (def: base_headers (List [Text Text]) diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux index 7df24358b..250f184bd 100644 --- a/stdlib/source/program/compositor.lux +++ b/stdlib/source/program/compositor.lux @@ -152,7 +152,7 @@ (<| (or_crash! "Compilation failed:") ..timed (do (try.with async.monad) - [.let [[compilation_host_dependencies compilation_libraries compilation_compilers compilation_sources compilation_target compilation_module] compilation] + [.let [[compilation_host_dependencies compilation_libraries compilation_compilers compilation_sources compilation_target compilation_module compilation_configuration] compilation] import (import.import (value@ platform.#&file_system platform) compilation_libraries) [state archive phase_wrapper] (:sharing [] (Platform ) @@ -162,7 +162,7 @@ Archive phase.Wrapper])) (:expected (platform.initialize file_context compilation_module expander host_analysis platform generation_bundle host_directive_bundle program anchorT,expressionT,directiveT extender - import compilation_sources))) + import compilation_sources compilation_configuration))) [archive state] (:sharing [] (Platform ) platform diff --git a/stdlib/source/test/lux/macro.lux b/stdlib/source/test/lux/macro.lux index ef7463d4e..f2e29ec1a 100644 --- a/stdlib/source/test/lux/macro.lux +++ b/stdlib/source/test/lux/macro.lux @@ -66,9 +66,10 @@ current_module (symbol.module (symbol .._))]] (in [seed symbol_prefix - [.#info [.#target "" + [.#info [.#target "" .#version "" - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 ""] .#location location.dummy .#current_module {.#Some current_module} diff --git a/stdlib/source/test/lux/macro/syntax/definition.lux b/stdlib/source/test/lux/macro/syntax/definition.lux index 82fc97e3e..faf667534 100644 --- a/stdlib/source/test/lux/macro/syntax/definition.lux +++ b/stdlib/source/test/lux/macro/syntax/definition.lux @@ -34,9 +34,10 @@ )) (def: compiler - [.#info [.#target "FAKE" + [.#info [.#target "FAKE" .#version "0.0.0" - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 ""] .#location location.dummy .#current_module {.#None} diff --git a/stdlib/source/test/lux/meta.lux b/stdlib/source/test/lux/meta.lux index 914e02d92..871cc155c 100644 --- a/stdlib/source/test/lux/meta.lux +++ b/stdlib/source/test/lux/meta.lux @@ -32,7 +32,9 @@ ["[0]" /]] ["[0]" / "_" ["[1][0]" location] - ["[1][0]" symbol]]) + ["[1][0]" symbol] + ["[1][0]" configuration] + ["[1][0]" version]]) (template: (!expect ) [(case @@ -50,9 +52,10 @@ expected_seed random.nat expected random.nat dummy (random.only (|>> (n.= expected) not) random.nat) - .let [expected_lux [.#info [.#target target + .let [expected_lux [.#info [.#target target .#version version - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 source_code] .#location location.dummy .#current_module {.#Some expected_current_module} @@ -98,9 +101,10 @@ expected random.nat dummy (random.only (|>> (n.= expected) not) random.nat) expected_error (random.ascii/upper 1) - .let [expected_lux [.#info [.#target target + .let [expected_lux [.#info [.#target target .#version version - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 source_code] .#location location.dummy .#current_module {.#Some expected_current_module} @@ -203,9 +207,10 @@ expected_module] [imported_module_name imported_module]) - expected_lux [.#info [.#target target + expected_lux [.#info [.#target target .#version version - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 source_code] .#location location.dummy .#current_module {.#Some expected_current_module} @@ -304,9 +309,10 @@ .let [type_context [.#ex_counter 0 .#var_counter 0 .#var_bindings (list)] - expected_lux [.#info [.#target target + expected_lux [.#info [.#target target .#version version - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 source_code] .#location expected_location .#current_module {.#Some expected_current_module} @@ -382,9 +388,10 @@ (list)))] [current_globals macro_globals - [.#info [.#target "" + [.#info [.#target "" .#version "" - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 ""] .#location location.dummy .#current_module {.#Some expected_current_module} @@ -497,9 +504,10 @@ (list)))] [current_globals macro_globals - [.#info [.#target "" + [.#info [.#target "" .#version "" - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 ""] .#location location.dummy .#current_module {.#Some expected_current_module} @@ -670,9 +678,10 @@ expected_lux (: Lux - [.#info [.#target "" + [.#info [.#target "" .#version "" - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 ""] .#location location.dummy .#current_module {.#Some current_module} @@ -821,9 +830,10 @@ .#mappings (list)]])] .let [expected_lux (: Lux - [.#info [.#target "" + [.#info [.#target "" .#version "" - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [location.dummy 0 ""] .#location location.dummy .#current_module {.#Some current_module} @@ -933,9 +943,10 @@ expected random.nat dummy (random.only (|>> (n.= expected) not) random.nat) expected_location ..random_location - .let [expected_lux [.#info [.#target target + .let [expected_lux [.#info [.#target target .#version version - .#mode {.#Build}] + .#mode {.#Build} + .#configuration (list)] .#source [expected_location 0 source_code] .#location expected_location .#current_module {.#Some expected_current_module} @@ -991,4 +1002,6 @@ /location.test /symbol.test + /configuration.test + /version.test ))) diff --git a/stdlib/source/test/lux/meta/configuration.lux b/stdlib/source/test/lux/meta/configuration.lux new file mode 100644 index 000000000..9776472d5 --- /dev/null +++ b/stdlib/source/test/lux/meta/configuration.lux @@ -0,0 +1,90 @@ +(.using + [library + [lux "*" + ["_" test {"+" Test}] + ["[0]" meta] + [abstract + [monad {"+" do}] + [\\specification + ["$[0]" equivalence] + ["$[0]" monoid]]] + [control + ["[0]" try ("[1]#[0]" functor)] + ["[0]" exception] + ["<>" parser + ["<[0]>" text] + ["<[0]>" code]]] + [data + ["[0]" text] + [collection + ["[0]" list]]] + ["[0]" macro + [syntax {"+" syntax:}] + ["[0]" code]] + [math + ["[0]" random {"+" Random} ("[1]#[0]" monad)]]]] + [\\library + ["[0]" /]]) + +(def: .public (random amount) + (-> Nat (Random /.Configuration)) + (case amount + 0 (random#in /.empty) + _ (do [! random.monad] + [feature (random.ascii/upper amount) + value (random.ascii/lower amount)] + (# ! each (|>> (list& [feature value])) + (random (-- amount)))))) + +(syntax: (failure [it .any]) + (function (_ lux) + (case (macro.expansion it lux) + {try.#Failure error} + {try.#Success [lux (list (code.text error))]} + + {try.#Success _} + {try.#Failure ""}))) + +(def: .public test + Test + (<| (_.covering /._) + (_.for [/.Configuration]) + (do [! random.monad] + [expected (..random 5)] + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence (..random 5))) + (_.for [/.monoid] + ($monoid.spec /.equivalence /.monoid (..random 5))) + + (_.cover [/.empty] + (list.empty? /.empty)) + (_.cover [/.format /.parser] + (|> expected + /.format + (.result /.parser) + (try#each (# /.equivalence = expected)) + (try.else false))) + (_.cover [/.for] + (and (and (/.for [["left" "<<<" + "right" ">>>"] + true] + false) + (/.for [["left" "<<<"] + true] + false) + (/.for [["right" ">>>"] + true] + false)) + (and (/.for [["yolo" ""] + false] + true) + (/.for [["left" "yolo"] + false] + true)))) + (_.cover [/.invalid] + (and (text.contains? (value@ exception.#label /.invalid) + (..failure (/.for []))) + (text.contains? (value@ exception.#label /.invalid) + (..failure (/.for [["left" "yolo"] false]))))) + )))) diff --git a/stdlib/source/test/lux/meta/version.lux b/stdlib/source/test/lux/meta/version.lux new file mode 100644 index 000000000..a279158ab --- /dev/null +++ b/stdlib/source/test/lux/meta/version.lux @@ -0,0 +1,55 @@ +(.using + [library + [lux "*" + ["_" test {"+" Test}] + ["[0]" static] + ["[0]" meta] + [abstract + [monad {"+" do}]] + [control + ["[0]" try] + ["[0]" exception] + [parser + ["<[0]>" code]]] + [data + ["[0]" text]] + ["[0]" macro + [syntax {"+" syntax:}] + ["[0]" code]] + [math + ["[0]" random] + [number + ["n" nat]]]]] + [\\library + ["[0]" /]]) + +(syntax: (failure [it .any]) + (function (_ lux) + (case (macro.expansion it lux) + {try.#Failure error} + {try.#Success [lux (list (code.text error))]} + + {try.#Success _} + {try.#Failure ""}))) + +(def: .public test + Test + (<| (_.covering /._) + (with_expansions [ (/.current) + (static.random code.text (random.ascii/lower 1))]) + ($_ _.and + (_.cover [/.latest] + (n.> 0 /.latest)) + (_.cover [/.current] + (not (text.empty? (/.current)))) + (_.cover [/.for] + (and (/.for [ true] + false) + (/.for [ false] + true))) + (_.cover [/.invalid] + (and (text.contains? (value@ exception.#label /.invalid) + (..failure (/.for []))) + (text.contains? (value@ exception.#label /.invalid) + (..failure (/.for [ false]))))) + ))) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/analysis.lux b/stdlib/source/test/lux/tool/compiler/language/lux/analysis.lux index 75f0d5d1c..ee058760a 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/analysis.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/analysis.lux @@ -23,7 +23,10 @@ [math ["[0]" random {"+" Random} ("[1]#[0]" monad)] [number - ["f" frac]]]]] + ["f" frac]]] + [meta + ["[0]" configuration "_" + ["$[1]" \\test]]]]] ["[0]" / "_" ["[1][0]" complex] ["[1][0]" inference] @@ -249,10 +252,11 @@ expected_error (random.ascii/lower 10) location/0 /location.random location/1 /location.random + configuration ($configuration.random 5) .let [state/0 (with@ .#location location/0 - (/.state (/.info version/0 host/0))) + (/.state (/.info version/0 host/0 configuration))) state/1 (with@ .#location location/1 - (/.state (/.info version/1 host/1)))]] + (/.state (/.info version/1 host/1 configuration)))]] ($_ _.and (_.cover [/.set_state] (|> (do phase.monad @@ -330,18 +334,20 @@ expected_file (random.ascii/lower 12) expected_code (random.ascii/lower 13) + configuration ($configuration.random 5) .let [state (with@ .#location location - (/.state (/.info version host)))]] + (/.state (/.info version host configuration)))]] ($_ _.and (_.cover [/.info] - (let [it (/.info version host)] + (let [it (/.info version host configuration)] (and (text#= (version.format version) (value@ .#version it)) (same? host (value@ .#target it)) - (..tagged? .#Build (value@ .#mode it))))) + (..tagged? .#Build (value@ .#mode it)) + (same? configuration (value@ .#configuration it))))) (_.cover [/.state] - (let [info (/.info version host) + (let [info (/.info version host configuration) it (/.state info)] (and (same? info (value@ .#info it)) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/inference.lux b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/inference.lux index 3eec3a5b4..63038413d 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/inference.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/inference.lux @@ -22,6 +22,8 @@ ["n" nat]]] [meta ["[0]" symbol "_" + ["$[1]" \\test]] + ["[0]" configuration "_" ["$[1]" \\test]]] ["[0]" type ("[1]#[0]" equivalence) ["[0]" check {"+" Check}]]]] @@ -56,8 +58,9 @@ (Random Lux) (do random.monad [version random.nat - host (random.ascii/lower 1)] - (in (//.state (//.info version host))))) + host (random.ascii/lower 1) + configuration ($configuration.random 5)] + (in (//.state (//.info version host configuration))))) (def: primitive (Random Type) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/macro.lux b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/macro.lux index b976dab87..d3f1ff62d 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/macro.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/macro.lux @@ -2,7 +2,6 @@ [library [lux "*" ["_" test {"+" Test}] - ["[0]" meta] [abstract [monad {"+" do}] [\\specification @@ -22,7 +21,10 @@ [math ["[0]" random {"+" Random} ("[1]#[0]" monad)] [number - ["n" nat]]]]] + ["n" nat]]] + ["[0]" meta + ["[0]" configuration "_" + ["$[1]" \\test]]]]] ["$" /////// "_" [macro ["[1][0]" code]] @@ -36,8 +38,9 @@ (Random Lux) (do random.monad [version random.nat - host (random.ascii/lower 1)] - (in (//.state (//.info version host))))) + host (random.ascii/lower 1) + configuration ($configuration.random 5)] + (in (//.state (//.info version host configuration))))) (def: (expander macro inputs state) /.Expander diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/module.lux b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/module.lux index d5cc7e0b8..69e7970f8 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/module.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/module.lux @@ -2,7 +2,6 @@ [library [lux "*" ["_" test {"+" Test}] - ["[0]" meta] [abstract ["[0]" monad {"+" do}]] [control @@ -18,7 +17,10 @@ [math ["[0]" random {"+" Random}] [number - ["n" nat]]]]] + ["n" nat]]] + ["[0]" meta + ["[0]" configuration "_" + ["$[1]" \\test]]]]] [\\library ["[0]" / ["/[1]" // @@ -32,8 +34,9 @@ (Random Lux) (do random.monad [version random.nat - host (random.ascii/lower 1)] - (in (//.state (//.info version host))))) + host (random.ascii/lower 1) + configuration ($configuration.random 5)] + (in (//.state (//.info version host configuration))))) (def: primitive (Random Type) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/type.lux b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/type.lux index 867ef7e5a..a5f1b5797 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/analysis/type.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/analysis/type.lux @@ -11,6 +11,9 @@ ["[0]" product]] [math ["[0]" random {"+" Random}]] + [meta + ["[0]" configuration "_" + ["$[1]" \\test]]] ["[0]" type ("[1]#[0]" equivalence) ["[0]" check]]]] [\\library @@ -27,8 +30,9 @@ (Random Lux) (do random.monad [version random.nat - host (random.ascii/lower 1)] - (in (//.state (//.info version host))))) + host (random.ascii/lower 1) + configuration ($configuration.random 5)] + (in (//.state (//.info version host configuration))))) (def: primitive (Random Type) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/complex.lux b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/complex.lux index 21813bb01..e7f6a5093 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/complex.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/complex.lux @@ -26,6 +26,8 @@ ["f" frac]]] [meta ["[0]" symbol + ["$[1]" \\test]] + ["[0]" configuration "_" ["$[1]" \\test]]] ["[0]" type ("[1]#[0]" equivalence) ["[0]" check]]]] @@ -61,8 +63,9 @@ (Random Lux) (do random.monad [version random.nat - host (random.ascii/lower 1)] - (in (//analysis.state (//analysis.info version host))))) + host (random.ascii/lower 1) + configuration ($configuration.random 5)] + (in (//analysis.state (//analysis.info version host configuration))))) (def: primitive (Random Type) diff --git a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/simple.lux b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/simple.lux index 45c22f1ec..86f813b1d 100644 --- a/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/simple.lux +++ b/stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/simple.lux @@ -11,7 +11,10 @@ [data ["[0]" product]] [math - ["[0]" random]]]] + ["[0]" random]] + [meta + ["[0]" configuration "_" + ["$[1]" \\test]]]]] [\\library ["[0]" / [/// @@ -75,7 +78,8 @@ [version random.nat host (random.ascii/lower 1) module (random.ascii/lower 2) - .let [state (/analysis.state (/analysis.info version host))]] + configuration ($configuration.random 5) + .let [state (/analysis.state (/analysis.info version host configuration))]] (`` ($_ _.and (_.cover [/.unit] (..analysis state module .Any /.unit diff --git a/stdlib/source/test/lux/tool/compiler/meta/cli.lux b/stdlib/source/test/lux/tool/compiler/meta/cli.lux index 15441533e..b90b8a0b3 100644 --- a/stdlib/source/test/lux/tool/compiler/meta/cli.lux +++ b/stdlib/source/test/lux/tool/compiler/meta/cli.lux @@ -20,6 +20,8 @@ ["n" nat]]] [meta ["[0]" symbol "_" + ["$[1]" \\test]] + ["[0]" configuration ("[1]#[0]" equivalence) ["$[1]" \\test]]]]] [\\library ["[0]" / @@ -40,13 +42,15 @@ target (random.ascii/lower 4) module (random.ascii/lower 5) compilers (random.list amount $/compiler.random) + configuration ($configuration.random 5) .let [compilation' ($_ list#composite (list#conjoint (list#each (|>> (list "--host_dependency")) host_dependencies)) (list#conjoint (list#each (|>> (list "--library")) libraries)) (list#conjoint (list#each (|>> /compiler.format (list "--compiler")) compilers)) (list#conjoint (list#each (|>> (list "--source")) sources)) - (list "--target" target) - (list "--module" module)) + (list "--target" target + "--module" module + "--configuration" (configuration.format configuration))) export ($_ list#composite (list#conjoint (list#each (|>> (list "--source")) sources)) (list "--target" target))]] @@ -72,6 +76,7 @@ [/.Source /.#sources (list#= sources)] [/.Target /.#target (same? target)] [/.Module /.#module (same? module)] + [configuration.Configuration /.#configuration (configuration#= configuration)] )) ))) (_.cover [/.Interpretation] @@ -93,6 +98,7 @@ [/.#sources (list#= sources)] [/.#target (same? target)] [/.#module (same? module)] + [/.#configuration (configuration#= configuration)] ))))) (_.cover [/.Export] (`` (and (~~ (template [ ] @@ -119,13 +125,15 @@ /.#compilers compilers /.#sources sources /.#target target - /.#module module]}] + /.#module module + /.#configuration configuration]}] [{/.#Interpretation [/.#host_dependencies host_dependencies /.#libraries libraries /.#compilers compilers /.#sources sources /.#target target - /.#module module]}] + /.#module module + /.#configuration configuration]}] [{/.#Export [sources target]}] ))))) -- cgit v1.2.3