aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Julian2022-02-23 05:30:53 -0400
committerEduardo Julian2022-02-23 05:30:53 -0400
commitf27a91a7b67790272578692ea20e2d875dbb3d35 (patch)
treecf0d9a53f3ef1b16be92ee5a120651b1abbb866d
parentf07effd9faf3fdaa677f659d6bbccf98931c5e5a (diff)
ADDED Can pass config parameters to compiler and select code based on it. Can also select code based on compiler version.
Diffstat (limited to '')
-rw-r--r--changelog.md3
-rw-r--r--lux-bootstrapper/src/lux/base.clj9
-rw-r--r--stdlib/source/library/lux.lux16
-rw-r--r--stdlib/source/library/lux/data/collection/dictionary/plist.lux37
-rw-r--r--stdlib/source/library/lux/meta.lux16
-rw-r--r--stdlib/source/library/lux/meta/configuration.lux103
-rw-r--r--stdlib/source/library/lux/meta/version.lux47
-rw-r--r--stdlib/source/library/lux/tool/compiler/default/init.lux9
-rw-r--r--stdlib/source/library/lux/tool/compiler/default/platform.lux13
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux.lux7
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/analysis.lux10
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/host.lux3
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/runtime.lux5
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/version.lux9
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/cli.lux10
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/io/archive.lux30
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/packager/ruby.lux3
-rw-r--r--stdlib/source/program/aedifex/command/build.lux15
-rw-r--r--stdlib/source/program/aedifex/command/deploy.lux107
-rw-r--r--stdlib/source/program/aedifex/command/install.lux87
-rw-r--r--stdlib/source/program/aedifex/command/version.lux31
-rw-r--r--stdlib/source/program/aedifex/dependency/resolution.lux5
-rw-r--r--stdlib/source/program/aedifex/format.lux3
-rw-r--r--stdlib/source/program/aedifex/hash.lux44
-rw-r--r--stdlib/source/program/aedifex/parser.lux26
-rw-r--r--stdlib/source/program/aedifex/profile.lux15
-rw-r--r--stdlib/source/program/aedifex/repository/identity.lux23
-rw-r--r--stdlib/source/program/aedifex/repository/remote.lux61
-rw-r--r--stdlib/source/program/compositor.lux4
-rw-r--r--stdlib/source/test/lux/macro.lux5
-rw-r--r--stdlib/source/test/lux/macro/syntax/definition.lux5
-rw-r--r--stdlib/source/test/lux/meta.lux51
-rw-r--r--stdlib/source/test/lux/meta/configuration.lux90
-rw-r--r--stdlib/source/test/lux/meta/version.lux55
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/analysis.lux20
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/analysis/inference.lux7
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/analysis/macro.lux11
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/analysis/module.lux11
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/analysis/type.lux8
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/complex.lux7
-rw-r--r--stdlib/source/test/lux/tool/compiler/language/lux/phase/analysis/simple.lux8
-rw-r--r--stdlib/source/test/lux/tool/compiler/meta/cli.lux16
42 files changed, 719 insertions, 326 deletions
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 [<type> <name> <slot>]
+ [(def: .public <name>
+ (Meta <type>)
+ (function (_ lux)
+ {try.#Success [lux
+ (value@ [.#info <slot>] 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 [<ascii> <name>]
+ [(def: <name>
+ Text
+ (text.of_char (hex <ascii>)))]
+
+ ["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 (<text>.this ..start))
+ (<>.before (<text>.this ..end))
+ (<text>.slice (<text>.some! (<text>.none_of! ..end)))))]
+ (<>.some (<>.and parser' parser'))))
+
+(exception: .public invalid)
+
+(def: configuration
+ (<code>.Parser Configuration)
+ (<code>.tuple (<>.some (<>.and <code>.text <code>.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 (<code>.tuple (<>.some (<>.and ..configuration <code>.any)))
+ default (<>.maybe <code>.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 (<code>.tuple (<>.some (<>.and <code>.text <code>.any)))
+ default (<>.maybe <code>.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 (_ <type_vars>)
(-> Context
descriptor.Module
@@ -251,18 +251,19 @@
(-> ///phase.Wrapper (///directive.Bundle <type_vars>))
(Program expression directive)
[Type Type Type] (-> ///phase.Wrapper Extender)
- Import (List _io.Context)
+ Import (List _io.Context) Configuration
(Async (Try [<State+> 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 (_ <type_vars>)
(-> <Platform> (Program expression directive) <State+>
@@ -753,7 +754,7 @@
(def: .public (compile phase_wrapper import file_context expander platform compilation context)
(All (_ <type_vars>)
(-> ///phase.Wrapper Import Context Expander <Platform> Compilation <Context> <Return>))
- (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 @@
["<b>" 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 <cli>.any]
[target_parser "--target" Target <cli>.any]
[module_parser "--module" Module <cli>.any]
+ [configuration_parser "--configuration" Configuration (<text>.then configuration.parser <cli>.any)]
)
(def: .public service
@@ -88,7 +91,8 @@
(<>.some ..compiler_parser)
(<>.some ..source_parser)
..target_parser
- ..module_parser))]
+ ..module_parser
+ ..configuration_parser))]
($_ <>.or
(<>.after (<cli>.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 [<name> <kind> <algorithm>]
[(def: .public (<name> value)
(-> Binary (Hash <kind>))
- (|> (java/security/MessageDigest::getInstance [<algorithm>])
+ (|> (java/security/MessageDigest::getInstance [(ffi.as_string <algorithm>)])
(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 @@
<code>.text)
(def: deploy_repository
- (Parser (List [Text //repository.Address]))
- (<code>.tuple (<>.some
- (<>.and <code>.text
- ..repository))))
+ (Parser [Text //repository.Address])
+ (<>.and <code>.text
+ ..repository))
+
+(def: configuration/1
+ (Parser [Text Text])
+ (<>.and <code>.text
+ <code>.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 [<parameters>]
(Platform <parameters>)
@@ -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 [<parameters>]
(Platform <parameters>)
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 <pattern> <value>)
[(case <value>
@@ -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 <code>.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
+ (<text>.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 <code>.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> (/.current)
+ <fake> (static.random code.text (random.ascii/lower 1))])
+ ($_ _.and
+ (_.cover [/.latest]
+ (n.> 0 /.latest))
+ (_.cover [/.current]
+ (not (text.empty? (/.current))))
+ (_.cover [/.for]
+ (and (/.for [<current> true]
+ false)
+ (/.for [<fake> false]
+ true)))
+ (_.cover [/.invalid]
+ (and (text.contains? (value@ exception.#label /.invalid)
+ (..failure (/.for [])))
+ (text.contains? (value@ exception.#label /.invalid)
+ (..failure (/.for [<fake> 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 [<side> <?>]
@@ -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]}]
)))))