aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Julian2021-07-17 22:48:54 -0400
committerEduardo Julian2021-07-17 22:48:54 -0400
commit442d1557b879a8a4bd76f441f72a17bfb71cf05f (patch)
tree7726138a487b3d64081c2cfdf99a564cf2b6ed7b
parent2c99b4515447315d76a8dc203a2dbcafc09506ea (diff)
Now allowing compilers to generate custom-named outputs.
Diffstat (limited to '')
-rw-r--r--documentation/bookmark/abstraction.md4
-rw-r--r--documentation/bookmark/arithmetic.md11
-rw-r--r--documentation/bookmark/browser.md1
-rw-r--r--documentation/bookmark/combinatory_logic.md5
-rw-r--r--documentation/bookmark/compiler.md1
-rw-r--r--documentation/bookmark/computational_effect.md4
-rw-r--r--documentation/bookmark/computer_science.md7
-rw-r--r--documentation/bookmark/concurrency.md4
-rw-r--r--documentation/bookmark/concurrency/actor.md4
-rw-r--r--documentation/bookmark/concurrency/security.md4
-rw-r--r--documentation/bookmark/data_science.md1
-rw-r--r--documentation/bookmark/database.md1
-rw-r--r--documentation/bookmark/game_programming.md1
-rw-r--r--documentation/bookmark/infrastructure/containers.md4
-rw-r--r--documentation/bookmark/integer.md4
-rw-r--r--documentation/bookmark/lazy_evaluation.md4
-rw-r--r--documentation/bookmark/macro.md4
-rw-r--r--documentation/bookmark/optimization.md5
-rw-r--r--documentation/bookmark/paradigm/logic_programming.md8
-rw-r--r--documentation/bookmark/paradigm/subjective_programming.md4
-rw-r--r--documentation/bookmark/platform/jvm.md1
-rw-r--r--documentation/bookmark/public_resource.md4
-rw-r--r--documentation/bookmark/quantum_computing.md4
-rw-r--r--documentation/bookmark/rendering.md5
-rw-r--r--documentation/bookmark/resource_management.md5
-rw-r--r--documentation/bookmark/sorting.md5
-rw-r--r--documentation/bookmark/system.md4
-rw-r--r--documentation/bookmark/type_theory/dependent_types.md1
-rw-r--r--documentation/bookmark/type_theory/inference.md4
-rw-r--r--documentation/bookmark/type_theory/unit.md1
-rw-r--r--documentation/bookmark/unsafe_programming.md5
-rw-r--r--documentation/bookmark/user_interface/accessibility.md1
-rw-r--r--lux-js/source/program.lux22
-rw-r--r--lux-jvm/source/luxc/lang/translation/jvm.lux32
-rw-r--r--lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux2
-rw-r--r--lux-jvm/source/luxc/lang/translation/jvm/function.lux2
-rw-r--r--lux-jvm/source/luxc/lang/translation/jvm/runtime.lux12
-rw-r--r--lux-lua/source/program.lux18
-rw-r--r--lux-python/source/program.lux9
-rw-r--r--lux-ruby/source/program.lux9
-rw-r--r--stdlib/source/library/lux/tool/compiler/default/init.lux4
-rw-r--r--stdlib/source/library/lux/tool/compiler/default/platform.lux4
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/generation.lux20
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux10
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/function.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux3
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/function.lux18
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/runtime.lux4
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/function.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/loop.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/runtime.lux3
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/case.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/function.lux4
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/loop.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/runtime.lux3
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/function.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/runtime.lux3
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/archive.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/archive/artifact.lux34
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/io/archive.lux52
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux15
-rw-r--r--stdlib/source/library/lux/tool/compiler/meta/packager/script.lux21
-rw-r--r--stdlib/source/library/lux/world/shell.lux12
-rw-r--r--stdlib/source/program/aedifex/dependency/resolution.lux14
-rw-r--r--stdlib/source/program/aedifex/pom.lux2
-rw-r--r--stdlib/source/test/aedifex/command/build.lux68
-rw-r--r--stdlib/source/test/aedifex/dependency.lux8
-rw-r--r--stdlib/source/test/aedifex/dependency/status.lux14
-rw-r--r--stdlib/source/test/aedifex/profile.lux25
-rw-r--r--stdlib/source/test/aedifex/repository/identity.lux2
-rw-r--r--stdlib/source/test/aedifex/runtime.lux7
-rw-r--r--stdlib/source/test/lux.lux37
72 files changed, 466 insertions, 162 deletions
diff --git a/documentation/bookmark/abstraction.md b/documentation/bookmark/abstraction.md
new file mode 100644
index 000000000..b66a147b0
--- /dev/null
+++ b/documentation/bookmark/abstraction.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [YOW! Lambda Jam 2017 Conal Elliott - Teaching New Tricks to Old Programs #YOWLambdaJam](https://www.youtube.com/watch?v=vzLK_xE9Zy8)
+
diff --git a/documentation/bookmark/arithmetic.md b/documentation/bookmark/arithmetic.md
new file mode 100644
index 000000000..c58dd4923
--- /dev/null
+++ b/documentation/bookmark/arithmetic.md
@@ -0,0 +1,11 @@
+# Saturation
+
+1. [Saturation arithmetic](https://en.wikipedia.org/wiki/Saturation_arithmetic)
+
+# Interval
+
+1. [Growing a Language, by Guy Steele](https://www.youtube.com/watch?v=_ahvzDzKdB0&t=2214s)
+1. [Yet another alternative to floating-point numbers](https://wordsandbuttons.online/yet_another_alternative_to_floating_point_numbers.html)
+1. [Interval arithmetic](https://en.wikipedia.org/wiki/Interval_arithmetic)
+1. [How do you compute the midpoint of an interval?](https://hal.archives-ouvertes.fr/file/index/docid/576641/filename/computing-midpoint.pdf)
+
diff --git a/documentation/bookmark/browser.md b/documentation/bookmark/browser.md
index 018b3b7b7..5fc699317 100644
--- a/documentation/bookmark/browser.md
+++ b/documentation/bookmark/browser.md
@@ -37,6 +37,7 @@
# Reference
1. [Public Suffix List](https://publicsuffix.org/)
+1. [Public Suffix List Problems](https://github.com/sleevi/psl-problems)
1. https://www.opera.com/gx
1. https://evertpot.com/tabs-are-the-wrong-abstraction/
1. http://news.mit.edu/2018/system-patches-private-browsing-0223
diff --git a/documentation/bookmark/combinatory_logic.md b/documentation/bookmark/combinatory_logic.md
new file mode 100644
index 000000000..1ded7e08e
--- /dev/null
+++ b/documentation/bookmark/combinatory_logic.md
@@ -0,0 +1,5 @@
+# Reference
+
+1. [YOW! Lambda Jam 2018 - Edward Kmett - Combinators Revisited](https://www.youtube.com/watch?v=zhj_tUMwTe0)
+1. [Combinatory Logic in Programming](https://doc.lagout.org/science/0_Computer%20Science/2_Algorithms/Combinatory%20Logic%20in%20Programming.pdf)
+
diff --git a/documentation/bookmark/compiler.md b/documentation/bookmark/compiler.md
index 390c22c5e..6cb381190 100644
--- a/documentation/bookmark/compiler.md
+++ b/documentation/bookmark/compiler.md
@@ -1,5 +1,6 @@
# Methodology
+1. [Scope herding with delimited continuations](https://blog.moertel.com/posts/2005-09-13-scope-herding-with-delimited-continuations.html)
1. [Compiling with Continuations by Andrew W. Appel](https://www.amazon.com/dp/0521416957)
1. [Collapsing Towers of Interpreters](https://www.cs.purdue.edu/homes/rompf/papers/amin-popl18.pdf)
1. [Miniphases: Compilation using Modular and Efficient Tree Transformations](https://infoscience.epfl.ch/record/228518/files/paper.pdf)
diff --git a/documentation/bookmark/computational_effect.md b/documentation/bookmark/computational_effect.md
new file mode 100644
index 000000000..d3d75ac09
--- /dev/null
+++ b/documentation/bookmark/computational_effect.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [A Categorical View of Computational Effects](https://www.youtube.com/watch?v=6t6bsWVOIzs)
+
diff --git a/documentation/bookmark/computer_science.md b/documentation/bookmark/computer_science.md
new file mode 100644
index 000000000..273d2300a
--- /dev/null
+++ b/documentation/bookmark/computer_science.md
@@ -0,0 +1,7 @@
+# Reference
+
+1. [PROGRAM DESIGN BY CALCULATION](http://www4.di.uminho.pt/~jno/ps/pdbc.pdf)
+1. [A Short Skinny on Relations & the Algebra of Programming](http://www.philipzucker.com/a-short-skinny-on-relations-towards-the-algebra-of-programming/)
+1. [Tensorial logic: A primitive logic of tensor and negation](https://www.irif.fr/~mellies/tensorial-logic.html)
+1. [Introduction to Theoretical Computer Science](https://introtcs.org/public/index.html)
+
diff --git a/documentation/bookmark/concurrency.md b/documentation/bookmark/concurrency.md
new file mode 100644
index 000000000..4d82d1c69
--- /dev/null
+++ b/documentation/bookmark/concurrency.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [OneFile - The world's first wait-free Software Transactional Memory](http://concurrencyfreaks.blogspot.com/2019/04/onefile-worlds-first-wait-free-software.html)
+
diff --git a/documentation/bookmark/concurrency/actor.md b/documentation/bookmark/concurrency/actor.md
new file mode 100644
index 000000000..bf6a3b621
--- /dev/null
+++ b/documentation/bookmark/concurrency/actor.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [otplike – Erlang/OTP processes and behaviours for Clojure - Alexey Aristov](https://www.youtube.com/watch?v=nHvRbZZhUDQ)
+
diff --git a/documentation/bookmark/concurrency/security.md b/documentation/bookmark/concurrency/security.md
new file mode 100644
index 000000000..1d48a21d8
--- /dev/null
+++ b/documentation/bookmark/concurrency/security.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [Robust Composition: Towards a Unified Approach to Access Control and Concurrency Control](http://erights.org/talks/thesis/markm-thesis.pdf)
+
diff --git a/documentation/bookmark/data_science.md b/documentation/bookmark/data_science.md
index d505d3178..aecf4e81f 100644
--- a/documentation/bookmark/data_science.md
+++ b/documentation/bookmark/data_science.md
@@ -1,4 +1,5 @@
# Reference
+1. [Exponential smoothing](https://en.wikipedia.org/wiki/Exponential_smoothing)
1. [High Performance Data With Clojure Chris Nuernberger](https://www.youtube.com/watch?v=5mUGu4RlwKE)
diff --git a/documentation/bookmark/database.md b/documentation/bookmark/database.md
index 5dc141142..2506f07c4 100644
--- a/documentation/bookmark/database.md
+++ b/documentation/bookmark/database.md
@@ -24,6 +24,7 @@
# Query
+1. [Comprehending Ringads](http://lambda-the-ultimate.org/node/5525)
1. [Reasons why SELECT * is bad for SQL performance](https://tanelpoder.com/posts/reasons-why-select-star-is-bad-for-sql-performance/)
1. [A Short Story About SQL’s Biggest Rival](https://www.holistics.io/blog/quel-vs-sql/)
1. https://calcite.apache.org/
diff --git a/documentation/bookmark/game_programming.md b/documentation/bookmark/game_programming.md
index 483c9b356..3191e7087 100644
--- a/documentation/bookmark/game_programming.md
+++ b/documentation/bookmark/game_programming.md
@@ -178,6 +178,7 @@
# Entity Component System (ECS)
+1. [Component Graph System](https://github.com/kvark/froggy/wiki/Component-Graph-System)
1. [Why Vanilla ECS Is Not Enough](https://ajmmertens.medium.com/why-vanilla-ecs-is-not-enough-d7ed4e3bebe5)
1. [On DOTS: Entity Component System](https://blogs.unity3d.com/2019/03/08/on-dots-entity-component-system/)
1. http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
diff --git a/documentation/bookmark/infrastructure/containers.md b/documentation/bookmark/infrastructure/containers.md
new file mode 100644
index 000000000..46f02845c
--- /dev/null
+++ b/documentation/bookmark/infrastructure/containers.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [The Ideal Versus the Real: Revisiting the History of Virtual Machines and Containers](https://arxiv.org/abs/1904.12226)
+
diff --git a/documentation/bookmark/integer.md b/documentation/bookmark/integer.md
new file mode 100644
index 000000000..e6630ed20
--- /dev/null
+++ b/documentation/bookmark/integer.md
@@ -0,0 +1,4 @@
+# Parsing
+
+1. [Faster Integer Parsing](https://rust-malaysia.github.io/code/2020/07/11/faster-integer-parsing.html)
+
diff --git a/documentation/bookmark/lazy_evaluation.md b/documentation/bookmark/lazy_evaluation.md
new file mode 100644
index 000000000..e20487b81
--- /dev/null
+++ b/documentation/bookmark/lazy_evaluation.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [Call-by-Need Is Clairvoyant Call-by-Value](http://www.cs.nott.ac.uk/~pszgmh/clairvoyant.pdf)
+
diff --git a/documentation/bookmark/macro.md b/documentation/bookmark/macro.md
new file mode 100644
index 000000000..7a5f6255a
--- /dev/null
+++ b/documentation/bookmark/macro.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [Fortifying Macros](https://www2.ccs.neu.edu/racket/pubs/icfp10-cf.pdf)
+
diff --git a/documentation/bookmark/optimization.md b/documentation/bookmark/optimization.md
index fe23c3e2a..e9e6f2109 100644
--- a/documentation/bookmark/optimization.md
+++ b/documentation/bookmark/optimization.md
@@ -1,3 +1,7 @@
+# Hashing
+
+1. [Fibonacci Hashing: The Optimization that the World Forgot (or: a Better Alternative to Integer Modulo)](https://probablydance.com/2018/06/16/fibonacci-hashing-the-optimization-that-the-world-forgot-or-a-better-alternative-to-integer-modulo/)
+
# Arithmetic
1. [Labor of Division (Episode I)](https://ridiculousfish.com/blog/posts/labor-of-division-episode-i.html)
@@ -20,6 +24,7 @@
# Reference
+1. [Do Low-level Optimizations Matter?](https://cantrip.org/sortfast.html)
1. [Inline caching](https://bernsteinbear.com/blog/inline-caching/)
1. [Weird and Wonderful Division Tricks](https://saml98.github.io/jekyll/update/2020/02/21/weird-division.htmls)
1. [Towards a Domain-Extensible Compiler: Optimizingan Image Processing Pipeline on Mobile CPUs](https://thok.eu/publications/2021/cgo.pdf)
diff --git a/documentation/bookmark/paradigm/logic_programming.md b/documentation/bookmark/paradigm/logic_programming.md
index d48cd9e27..caf03f67d 100644
--- a/documentation/bookmark/paradigm/logic_programming.md
+++ b/documentation/bookmark/paradigm/logic_programming.md
@@ -1,3 +1,11 @@
+# Unification
+
+1. [Functors of the World, Unite!](https://www.youtube.com/watch?v=8k7YH9st_8U)
+
+# Inspiration
+
+1. [Next-Paradigm Programming Languages: What Will They Look Like and What Changes Will They Bring?](https://arxiv.org/abs/1905.00402)
+
# Reference
1. https://book.simply-logical.space/
diff --git a/documentation/bookmark/paradigm/subjective_programming.md b/documentation/bookmark/paradigm/subjective_programming.md
new file mode 100644
index 000000000..964571c7e
--- /dev/null
+++ b/documentation/bookmark/paradigm/subjective_programming.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [Dancing with Symmetry to Harness the Power of Complexity: Subjective Programming in Context](https://www.infoq.com/presentations/oop-language-context/)
+
diff --git a/documentation/bookmark/platform/jvm.md b/documentation/bookmark/platform/jvm.md
index 7e8969b91..f804b80e2 100644
--- a/documentation/bookmark/platform/jvm.md
+++ b/documentation/bookmark/platform/jvm.md
@@ -1,5 +1,6 @@
# Reference
+1. [String concatenation, redux](https://cl4es.github.io/2019/05/14/String-Concat-Redux.html)
1. [Beware of computation in static initializer](https://pangin.pro/posts/computation-in-static-initializer)
1. [JVM Internals](https://blog.jamesdbloom.com/JVMInternals.html)
1. [JVM Anatomy Quarks](https://shipilev.net/jvm/anatomy-quarks/)
diff --git a/documentation/bookmark/public_resource.md b/documentation/bookmark/public_resource.md
new file mode 100644
index 000000000..147744b5c
--- /dev/null
+++ b/documentation/bookmark/public_resource.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [Public API Lists](https://github.com/public-api-lists/public-api-lists)
+
diff --git a/documentation/bookmark/quantum_computing.md b/documentation/bookmark/quantum_computing.md
new file mode 100644
index 000000000..229c39289
--- /dev/null
+++ b/documentation/bookmark/quantum_computing.md
@@ -0,0 +1,4 @@
+# Programming Language
+
+1. [Silq](https://silq.ethz.ch/)
+
diff --git a/documentation/bookmark/rendering.md b/documentation/bookmark/rendering.md
index 7ee38f83d..4222fea4b 100644
--- a/documentation/bookmark/rendering.md
+++ b/documentation/bookmark/rendering.md
@@ -1,3 +1,8 @@
+# Physically Based Rendering
+
+1. [Physically Based Rendering](https://www.pbr-book.org/3ed-2018/contents)
+1. [Physically Based Rendering in Filament](https://google.github.io/filament/Filament.html)
+
# Reference
1. [Geometry Types for Graphics Programming](https://www.cs.cornell.edu/~asampson/media/papers/gator-oopsla2020-preprint.pdf)
diff --git a/documentation/bookmark/resource_management.md b/documentation/bookmark/resource_management.md
new file mode 100644
index 000000000..3b353ccab
--- /dev/null
+++ b/documentation/bookmark/resource_management.md
@@ -0,0 +1,5 @@
+# Reference
+
+1. [Understanding ResourceT](https://www.fpcomplete.com/blog/2017/06/understanding-resourcet/)
+1. [Composable resource management in Scala](https://bszwej.medium.com/composable-resource-management-in-scala-ce902bda48b2)
+
diff --git a/documentation/bookmark/sorting.md b/documentation/bookmark/sorting.md
new file mode 100644
index 000000000..3906a4d3f
--- /dev/null
+++ b/documentation/bookmark/sorting.md
@@ -0,0 +1,5 @@
+# Reference
+
+1. [discrimination: Fast generic linear-time sorting, joins and container construction.](https://hackage.haskell.org/package/discrimination-0.1)
+1. [Radix Sort, Trie Trees, and Maps from Representable Functors](https://chrispenner.ca/posts/representable-discrimination)
+
diff --git a/documentation/bookmark/system.md b/documentation/bookmark/system.md
new file mode 100644
index 000000000..01cd20ef8
--- /dev/null
+++ b/documentation/bookmark/system.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [On system rollback and totalised fields: An algebraic approach to system change](http://markburgess.org/papers/totalfield.pdf)
+
diff --git a/documentation/bookmark/type_theory/dependent_types.md b/documentation/bookmark/type_theory/dependent_types.md
index c46522210..6feb91d99 100644
--- a/documentation/bookmark/type_theory/dependent_types.md
+++ b/documentation/bookmark/type_theory/dependent_types.md
@@ -5,6 +5,7 @@
# Reference
+1. [The Gentle Art of Levitation](http://lambda-the-ultimate.org/node/5526)
1. [Programming up to Congruence](http://www.cs.yale.edu/homes/vilhelm/papers/popl15congruence.pdf)
1. [From Scheme to Dependent Types in 100 lines by Gershom Bazerman (Part 1)](https://vimeo.com/134561872)
1. [From Scheme to Dependent Types in 100 Lines by Gershom Bazerman (Part 2)](https://vimeo.com/135746080)
diff --git a/documentation/bookmark/type_theory/inference.md b/documentation/bookmark/type_theory/inference.md
new file mode 100644
index 000000000..f5ee9cb07
--- /dev/null
+++ b/documentation/bookmark/type_theory/inference.md
@@ -0,0 +1,4 @@
+# Reference
+
+1. [Functors of the World, Unite!](https://www.youtube.com/watch?v=8k7YH9st_8U)
+
diff --git a/documentation/bookmark/type_theory/unit.md b/documentation/bookmark/type_theory/unit.md
index 5f5306117..cf23e396c 100644
--- a/documentation/bookmark/type_theory/unit.md
+++ b/documentation/bookmark/type_theory/unit.md
@@ -1,4 +1,5 @@
# Reference
+1. https://en.wikipedia.org/wiki/Metric_prefix#Metric_units
1. [unittyped: An extendable library for type-safe computations including units.](https://hackage.haskell.org/package/unittyped)
diff --git a/documentation/bookmark/unsafe_programming.md b/documentation/bookmark/unsafe_programming.md
new file mode 100644
index 000000000..82a6f0e6d
--- /dev/null
+++ b/documentation/bookmark/unsafe_programming.md
@@ -0,0 +1,5 @@
+# Reference
+
+1. [Pure destination-passing style in Linear Haskell](https://www.tweag.io/blog/2020-11-11-linear-dps/)
+1. [Episode 27: I Promise; Trust Me](https://newrustacean.com/show_notes/e027/struct.script)
+
diff --git a/documentation/bookmark/user_interface/accessibility.md b/documentation/bookmark/user_interface/accessibility.md
index 5a0645773..6519470b3 100644
--- a/documentation/bookmark/user_interface/accessibility.md
+++ b/documentation/bookmark/user_interface/accessibility.md
@@ -1,4 +1,5 @@
# Reference
+1. [Detecting Hover-Capable Devices](https://css-irl.info/detecting-hover-capable-devices/)
1. [Nobody talks about the real reason to use Tabs over Spaces](https://www.reddit.com/r/javascript/comments/c8drjo/nobody_talks_about_the_real_reason_to_use_tabs/?st=jxuy98ok&sh=8487bdfa)
diff --git a/lux-js/source/program.lux b/lux-js/source/program.lux
index 6163c2dfa..295aba2ce 100644
--- a/lux-js/source/program.lux
+++ b/lux-js/source/program.lux
@@ -465,9 +465,10 @@
[?output (javax/script/ScriptEngine::eval (_.code input) interpreter)]
(wrap [])))
- (def: (define! interpreter context input)
- (-> javax/script/ScriptEngine Context _.Expression (Try [Text Any _.Statement]))
- (let [global (reference.artifact context)
+ (def: (define! interpreter context custom input)
+ (-> javax/script/ScriptEngine Context (Maybe Text) _.Expression (Try [Text Any _.Statement]))
+ (let [global (maybe.default (reference.artifact context)
+ custom)
@global (_.var global)]
(do try.monad
[#let [definition (_.define @global input)]
@@ -488,10 +489,10 @@
(def: (ingest context content)
(|> content (\ utf8.codec decode) try.assume (:as _.Statement)))
- (def: (re_learn context content)
+ (def: (re_learn context custom content)
(..execute! interpreter content))
- (def: (re_load context content)
+ (def: (re_load context custom content)
(do try.monad
[_ (..execute! interpreter content)]
(..evaluate! interpreter context (_.var (reference.artifact context))))))))))
@@ -525,9 +526,10 @@
[?output (..eval (_.code input))]
(wrap [])))
- (def: (define! context input)
- (-> Context _.Expression (Try [Text Any _.Statement]))
- (let [global (reference.artifact context)
+ (def: (define! context custom input)
+ (-> Context (Maybe Text) _.Expression (Try [Text Any _.Statement]))
+ (let [global (maybe.default (reference.artifact context)
+ custom)
@global (_.var global)]
(do try.monad
[#let [definition (_.define @global input)]
@@ -546,10 +548,10 @@
(def: (ingest context content)
(|> content (\ utf8.codec decode) try.assume (:as _.Statement)))
- (def: (re_learn context content)
+ (def: (re_learn context custom content)
(..execute! content))
- (def: (re_load context content)
+ (def: (re_load context custom content)
(do try.monad
[_ (..execute! content)]
(..evaluate! context (_.var (reference.artifact context)))))))))
diff --git a/lux-jvm/source/luxc/lang/translation/jvm.lux b/lux-jvm/source/luxc/lang/translation/jvm.lux
index 4cd521f9f..0f6ba6744 100644
--- a/lux-jvm/source/luxc/lang/translation/jvm.lux
+++ b/lux-jvm/source/luxc/lang/translation/jvm.lux
@@ -14,6 +14,7 @@
[data
[binary (#+ Binary)]
["." product]
+ ["." maybe]
["." text ("#@." hash)
["%" format (#+ format)]]
[collection
@@ -145,11 +146,13 @@
(loader.store class_name class_bytecode library))]
(loader.load class_name loader))))
-(def: (define! library loader context valueI)
- (-> Library java/lang/ClassLoader generation.Context Inst (Try [Text Any Definition]))
+(def: (define! library loader context custom valueI)
+ (-> Library java/lang/ClassLoader generation.Context (Maybe Text) Inst (Try [Text Any Definition]))
(do try.monad
[[value definition] (evaluate! library loader context valueI)]
- (wrap [(..class_name context) value definition])))
+ (wrap [(maybe.default (..class_name context)
+ custom)
+ value definition])))
(def: #export host
(IO Host)
@@ -170,19 +173,26 @@
(def: (ingest context bytecode)
[(..class_name context) bytecode])
- (def: (re_learn context [_ bytecode])
+ (def: (re_learn context custom [_ bytecode])
(io.run
- (loader.store (..class_name context) bytecode library)))
+ (loader.store (maybe.default (..class_name context) custom) bytecode library)))
- (def: (re_load context [_ bytecode])
+ (def: (re_load context custom [_ bytecode])
(io.run
(do (try.with io.monad)
- [#let [class_name (..class_name context)]
+ [#let [class_name (maybe.default (..class_name context) custom)]
_ (loader.store class_name bytecode library)
class (loader.load class_name loader)]
(\ io.monad wrap (..class_value class_name class))))))))))
-(def: #export $Variant (type.array ..$Value))
-(def: #export $Tuple (type.array ..$Value))
-(def: #export $Runtime (type.class (..class_name [0 0]) (list)))
-(def: #export $Function (type.class (..class_name [0 1]) (list)))
+(def: #export $Variant
+ (type.array ..$Value))
+
+(def: #export $Tuple
+ (type.array ..$Value))
+
+(def: #export $Runtime
+ (type.class (..class_name [0 0]) (list)))
+
+(def: #export $Function
+ (type.class (..class_name [0 1]) (list)))
diff --git a/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux b/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux
index 69e63ab71..441a415ee 100644
--- a/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux
+++ b/lux-jvm/source/luxc/lang/translation/jvm/extension/host.lux
@@ -1053,7 +1053,7 @@
(..with_anonymous_init class total_environment super_class inputsTI)
method_definitions))]]
_ (generation.execute! directive)
- _ (generation.save! artifact_id directive)]
+ _ (generation.save! artifact_id #.None directive)]
(..anonymous_instance generate archive class total_environment)))]))
(def: bundle::class
diff --git a/lux-jvm/source/luxc/lang/translation/jvm/function.lux b/lux-jvm/source/luxc/lang/translation/jvm/function.lux
index f524dc097..394b0b7b5 100644
--- a/lux-jvm/source/luxc/lang/translation/jvm/function.lux
+++ b/lux-jvm/source/luxc/lang/translation/jvm/function.lux
@@ -328,7 +328,7 @@
_ (generation.execute! directive)
_ (case forced_context
#.None
- (generation.save! (product.right function_context) directive)
+ (generation.save! (product.right function_context) #.None directive)
(#.Some function_context)
(wrap []))]
diff --git a/lux-jvm/source/luxc/lang/translation/jvm/runtime.lux b/lux-jvm/source/luxc/lang/translation/jvm/runtime.lux
index 20bd9bd9e..e0426f363 100644
--- a/lux-jvm/source/luxc/lang/translation/jvm/runtime.lux
+++ b/lux-jvm/source/luxc/lang/translation/jvm/runtime.lux
@@ -339,7 +339,7 @@
0)
(def: translate_runtime
- (Operation [artifact.ID Binary])
+ (Operation [artifact.ID (Maybe Text) Binary])
(let [runtime_class (..reflection //.$Runtime)
bytecode ($d.class #$.V1_6 #$.Public $.finalC runtime_class (list) (type.class "java.lang.Object" (list)) (list)
(|>> adt_methods
@@ -349,14 +349,14 @@
directive [runtime_class bytecode]]
(do phase.monad
[_ (generation.execute! directive)
- _ (generation.save! ..runtime_id directive)]
- (wrap [..runtime_id bytecode]))))
+ _ (generation.save! ..runtime_id #.None directive)]
+ (wrap [..runtime_id #.None bytecode]))))
(def: function_id
1)
(def: translate_function
- (Operation [artifact.ID Binary])
+ (Operation [artifact.ID (Maybe Text) Binary])
(let [applyI (|> (enum.range n.enum 2 num_apply_variants)
(list@map (function (_ arity)
($d.method #$.Public $.noneM apply_method (apply_signature arity)
@@ -386,8 +386,8 @@
directive [function_class bytecode]]
(do phase.monad
[_ (generation.execute! directive)
- _ (generation.save! ..function_id directive)]
- (wrap [..function_id bytecode]))))
+ _ (generation.save! ..function_id #.None directive)]
+ (wrap [..function_id #.None bytecode]))))
(def: #export translate
(Operation [Registry Output])
diff --git a/lux-lua/source/program.lux b/lux-lua/source/program.lux
index 6c7719220..0bb73d348 100644
--- a/lux-lua/source/program.lux
+++ b/lux-lua/source/program.lux
@@ -561,8 +561,9 @@
(def: execute! run!)
- (def: (define! context input)
- (let [global (reference.artifact context)
+ (def: (define! context custom input)
+ (let [global (maybe.default (reference.artifact context)
+ custom)
@global (_.var global)]
(do try.monad
[#let [definition (_.set (list @global) input)]
@@ -573,10 +574,10 @@
(def: (ingest context content)
(|> content (\ utf8.codec decode) try.assume (:as _.Statement)))
- (def: (re_learn context content)
+ (def: (re_learn context custom content)
(run! content))
- (def: (re_load context content)
+ (def: (re_load context custom content)
(do try.monad
[_ (run! content)]
(run! (_.return (_.var (reference.artifact context))))))))]))))
@@ -598,8 +599,9 @@
(def: execute! run!)
- (def: (define! context input)
- (let [global (reference.artifact context)
+ (def: (define! context custom input)
+ (let [global (maybe.default (reference.artifact context)
+ custom)
@global (_.var global)]
(do try.monad
[#let [definition (_.set (list @global) input)]
@@ -610,10 +612,10 @@
(def: (ingest context content)
(|> content (\ utf8.codec decode) try.assume (:as _.Statement)))
- (def: (re_learn context content)
+ (def: (re_learn context custom content)
(run! content))
- (def: (re_load context content)
+ (def: (re_load context custom content)
(do try.monad
[_ (run! content)]
(run! (_.return (_.var (reference.artifact context))))))))))))})
diff --git a/lux-python/source/program.lux b/lux-python/source/program.lux
index f00594c99..f7c167368 100644
--- a/lux-python/source/program.lux
+++ b/lux-python/source/program.lux
@@ -276,8 +276,9 @@
(implementation
(def: evaluate! evaluate!)
(def: execute! execute!)
- (def: (define! context input)
- (let [global (reference.artifact context)
+ (def: (define! context custom input)
+ (let [global (maybe.default (reference.artifact context)
+ custom)
@global (_.var global)]
(do try.monad
[#let [definition (_.set (list @global) input)]
@@ -291,10 +292,10 @@
try.assume
(:as (_.Statement Any))))
- (def: (re_learn context content)
+ (def: (re_learn context custom content)
(execute! content))
- (def: (re_load context content)
+ (def: (re_load context custom content)
(do try.monad
[_ (execute! content)]
(evaluate! context (_.var (reference.artifact context))))))))))
diff --git a/lux-ruby/source/program.lux b/lux-ruby/source/program.lux
index a221e6529..2e77c85f4 100644
--- a/lux-ruby/source/program.lux
+++ b/lux-ruby/source/program.lux
@@ -623,8 +623,9 @@
(def: execute! run!)
- (def: (define! context input)
- (let [global (reference.artifact context)
+ (def: (define! context custom input)
+ (let [global (maybe.default (reference.artifact context)
+ custom)
@global (_.global global)]
(do try.monad
[#let [definition (_.set (list @global) input)]
@@ -637,10 +638,10 @@
try.assume
(:as _.Statement)))
- (def: (re_learn context content)
+ (def: (re_learn context custom content)
(run! content))
- (def: (re_load context content)
+ (def: (re_load context custom content)
(do try.monad
[_ (run! content)]
(run! (_.global (reference.artifact context))))))))))
diff --git a/stdlib/source/library/lux/tool/compiler/default/init.lux b/stdlib/source/library/lux/tool/compiler/default/init.lux
index 172de25e7..3d49eb706 100644
--- a/stdlib/source/library/lux/tool/compiler/default/init.lux
+++ b/stdlib/source/library/lux/tool/compiler/default/init.lux
@@ -258,8 +258,8 @@
(wrap [state
(#.Right [descriptor
(document.write key analysis_module)
- (row\map (function (_ [artifact_id directive])
- [artifact_id (write_directive directive)])
+ (row\map (function (_ [artifact_id custom directive])
+ [artifact_id custom (write_directive directive)])
final_buffer)])]))
(#.Some [source requirements temporary_payload])
diff --git a/stdlib/source/library/lux/tool/compiler/default/platform.lux b/stdlib/source/library/lux/tool/compiler/default/platform.lux
index 9ebf79b7b..bc0e9b3cc 100644
--- a/stdlib/source/library/lux/tool/compiler/default/platform.lux
+++ b/stdlib/source/library/lux/tool/compiler/default/platform.lux
@@ -98,8 +98,8 @@
(-> Static <Platform> archive.ID [Descriptor (Document Any) Output]
(Promise (Try Any))))
(let [system (get@ #&file_system platform)
- write_artifact! (: (-> [artifact.ID Binary] (Action Any))
- (function (_ [artifact_id content])
+ write_artifact! (: (-> [artifact.ID (Maybe Text) Binary] (Action Any))
+ (function (_ [artifact_id custom content])
(ioW.write system static module_id artifact_id content)))]
(do {! ..monad}
[_ (ioW.prepare system static module_id)
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/generation.lux b/stdlib/source/library/lux/tool/compiler/language/lux/generation.lux
index 13d36021f..02adbd2bd 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/generation.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/generation.lux
@@ -34,7 +34,7 @@
[archive.ID artifact.ID])
(type: #export (Buffer directive)
- (Row [artifact.ID directive]))
+ (Row [artifact.ID (Maybe Text) directive]))
(exception: #export (cannot_interpret {error Text})
(exception.report
@@ -54,14 +54,14 @@
evaluate!)
(: (-> directive (Try Any))
execute!)
- (: (-> Context expression (Try [Text Any directive]))
+ (: (-> Context (Maybe Text) expression (Try [Text Any directive]))
define!)
(: (-> Context Binary directive)
ingest)
- (: (-> Context directive (Try Any))
+ (: (-> Context (Maybe Text) directive (Try Any))
re_learn)
- (: (-> Context directive (Try Any))
+ (: (-> Context (Maybe Text) directive (Try Any))
re_load))
(type: #export (State anchor expression directive)
@@ -210,20 +210,20 @@
(#try.Failure error)
(exception.throw ..cannot_interpret error))))
-(def: #export (define! context code)
+(def: #export (define! context custom code)
(All [anchor expression directive]
- (-> Context expression (Operation anchor expression directive [Text Any directive])))
+ (-> Context (Maybe Text) expression (Operation anchor expression directive [Text Any directive])))
(function (_ (^@ stateE [bundle state]))
- (case (\ (get@ #host state) define! context code)
+ (case (\ (get@ #host state) define! context custom code)
(#try.Success output)
(#try.Success [stateE output])
(#try.Failure error)
(exception.throw ..cannot_interpret error))))
-(def: #export (save! artifact_id code)
+(def: #export (save! artifact_id custom code)
(All [anchor expression directive]
- (-> artifact.ID directive (Operation anchor expression directive Any)))
+ (-> artifact.ID (Maybe Text) directive (Operation anchor expression directive Any)))
(do {! phase.monad}
[?buffer (extension.read (get@ #buffer))]
(case ?buffer
@@ -231,7 +231,7 @@
## TODO: Optimize by no longer checking for overwrites...
(if (row.any? (|>> product.left (n.= artifact_id)) buffer)
(phase.throw ..cannot_overwrite_output [artifact_id])
- (extension.update (set@ #buffer (#.Some (row.add [artifact_id code] buffer)))))
+ (extension.update (set@ #buffer (#.Some (row.add [artifact_id custom code] buffer)))))
#.None
(phase.throw ..no_buffer_for_saving_code [artifact_id]))))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux
index dc8272030..8fd5d2416 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/directive/lux.lux
@@ -114,8 +114,8 @@
[codeG (generate archive codeS)
id (/////generation.learn name)
module_id (phase.lift (archive.id module archive))
- [target_name value directive] (/////generation.define! [module_id id] codeG)
- _ (/////generation.save! id directive)]
+ [target_name value directive] (/////generation.define! [module_id id] #.None codeG)
+ _ (/////generation.save! id #.None directive)]
(wrap [code//type codeG value]))))
(def: (definition archive name expected codeC)
@@ -166,8 +166,8 @@
[codeG (generate archive codeS)
module_id (phase.lift (archive.id current_module archive))
id (<learn> extension)
- [target_name value directive] (/////generation.define! [module_id id] codeG)
- _ (/////generation.save! id directive)]
+ [target_name value directive] (/////generation.define! [module_id id] #.None codeG)
+ _ (/////generation.save! id #.None directive)]
(wrap [codeG value])))))
(def: #export (<full> archive extension codeT codeC)
@@ -393,7 +393,7 @@
(do phase.monad
[programG (generate archive programS)
artifact_id (/////generation.learn /////program.name)]
- (/////generation.save! artifact_id (program [module_id artifact_id] programG))))
+ (/////generation.save! artifact_id #.None (program [module_id artifact_id] programG))))
(def: (def::program program)
(All [anchor expression directive]
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/function.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/function.lux
index df13919b0..0f2d9adf6 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/function.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/function.lux
@@ -119,5 +119,5 @@
@self))))))))
))]
_ (/////generation.execute! definition)
- _ (/////generation.save! (product.right function_name) definition)]
+ _ (/////generation.save! (product.right function_name) #.None definition)]
(wrap instantiation)))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux
index 2f6370418..65783662a 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux
@@ -775,11 +775,12 @@
(Operation [Registry Output])
(do ///////phase.monad
[_ (/////generation.execute! ..runtime)
- _ (/////generation.save! ..module_id ..runtime)]
+ _ (/////generation.save! ..module_id #.None ..runtime)]
(wrap [(|> artifact.empty
artifact.resource
product.right)
(row.row [..module_id
+ #.None
(|> ..runtime
_.code
(\ utf8.codec encode))])])))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/function.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/function.lux
index 37cda09e1..42d9cf2a4 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/function.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/function.lux
@@ -87,7 +87,7 @@
class.public
class.final))
-(def: this-offset 1)
+(def: this_offset 1)
(def: internal
(All [category]
@@ -98,22 +98,22 @@
(def: #export (abstraction generate archive [environment arity bodyS])
(Generator Abstraction)
(do phase.monad
- [@begin //runtime.forge-label
- [function-context bodyG] (generation.with-new-context archive
- (generation.with-anchor [@begin ..this-offset]
+ [@begin //runtime.forge_label
+ [function_context bodyG] (generation.with_new_context archive
+ (generation.with_anchor [@begin ..this_offset]
(generate archive bodyS)))
- #let [function-class (//runtime.class-name function-context)]
- [fields methods instance] (..with generate archive @begin function-class environment arity bodyG)
+ #let [function_class (//runtime.class_name function_context)]
+ [fields methods instance] (..with generate archive @begin function_class environment arity bodyG)
class (phase.lift (class.class version.v6_0
..modifier
- (name.internal function-class)
+ (name.internal function_class)
(..internal /abstract.class) (list)
fields
methods
(row.row)))
#let [bytecode (format.run class.writer class)]
- _ (generation.execute! [function-class bytecode])
- _ (generation.save! function-class [function-class bytecode])]
+ _ (generation.execute! [function_class bytecode])
+ _ (generation.save! function_class #.None [function_class bytecode])]
(wrap instance)))
(def: #export (apply generate archive [abstractionS inputsS])
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 e445ec2d4..edfa6d78d 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
@@ -537,7 +537,7 @@
(row.row)))]
(do ////.monad
[_ (generation.execute! [class bytecode])]
- (generation.save! ..artifact_id [class bytecode]))))
+ (generation.save! ..artifact_id #.None [class bytecode]))))
(def: generate_function
(Operation Any)
@@ -594,7 +594,7 @@
(row.row)))]
(do ////.monad
[_ (generation.execute! [class bytecode])]
- (generation.save! //function.artifact_id [class bytecode]))))
+ (generation.save! //function.artifact_id #.None [class bytecode]))))
(def: #export generate
(Operation Any)
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/function.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/function.lux
index 97a5b1691..789d30fcc 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/function.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/function.lux
@@ -133,5 +133,5 @@
(_.apply/1 @self))))))))
))]
_ (/////generation.execute! definition)
- _ (/////generation.save! (product.right function_name) definition)]
+ _ (/////generation.save! (product.right function_name) #.None definition)]
(wrap instantiation)))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/loop.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/loop.lux
index a6719856c..18b65c352 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/loop.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/loop.lux
@@ -108,7 +108,7 @@
))
(|> @context (_.apply/* foreigns))])))]
_ (/////generation.execute! directive)
- _ (/////generation.save! artifact_id directive)]
+ _ (/////generation.save! artifact_id #.None directive)]
(wrap (|> instantiation (_.apply/* initsO+))))))
(def: #export (recur! statement expression archive argsS+)
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/runtime.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/runtime.lux
index a0266db38..8f1e5b117 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/runtime.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/lua/runtime.lux
@@ -422,11 +422,12 @@
(Operation [Registry Output])
(do ///////phase.monad
[_ (/////generation.execute! ..runtime)
- _ (/////generation.save! ..module_id ..runtime)]
+ _ (/////generation.save! ..module_id #.None ..runtime)]
(wrap [(|> artifact.empty
artifact.resource
product.right)
(row.row [..module_id
+ #.None
(|> ..runtime
_.code
(\ utf8.codec encode))])])))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/case.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/case.lux
index a4e5e81fc..3a776a2a7 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/case.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/case.lux
@@ -330,5 +330,5 @@
directive (_.def @case @dependencies+
pattern_matching!)]
_ (/////generation.execute! directive)
- _ (/////generation.save! case_artifact directive)]
+ _ (/////generation.save! case_artifact #.None directive)]
(wrap (_.apply/* @case @dependencies+))))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/function.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/function.lux
index ca18fb0ef..d2e70def2 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/function.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/function.lux
@@ -48,7 +48,7 @@
#.Nil
(do ///////phase.monad
[_ (/////generation.execute! function_definition)
- _ (/////generation.save! function_id function_definition)]
+ _ (/////generation.save! function_id #.None function_definition)]
(wrap @function))
_
@@ -60,7 +60,7 @@
function_definition
(_.return @function)))]
_ (/////generation.execute! directive)
- _ (/////generation.save! function_id directive)]
+ _ (/////generation.save! function_id #.None directive)]
(wrap (_.apply/* @function inits)))))
(def: input
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/loop.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/loop.lux
index 353c890f9..4ec21d754 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/loop.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/loop.lux
@@ -103,7 +103,7 @@
))
(_.apply/* @loop foreigns)]))]
_ (/////generation.execute! directive)
- _ (/////generation.save! loop_artifact directive)]
+ _ (/////generation.save! loop_artifact #.None directive)]
(wrap (_.apply/* instantiation initsO+)))))
(def: #export (recur! statement expression archive argsS+)
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/runtime.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/runtime.lux
index 7a19539df..34009976f 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/runtime.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python/runtime.lux
@@ -450,11 +450,12 @@
(/////generation.with_buffer
(do ///////phase.monad
[_ (/////generation.execute! ..runtime)
- _ (/////generation.save! ..module_id ..runtime)]
+ _ (/////generation.save! ..module_id #.None ..runtime)]
(wrap [(|> artifact.empty
artifact.resource
product.right)
(row.row [..module_id
+ #.None
(|> ..runtime
_.code
(\ utf8.codec encode))])]))))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/function.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/function.lux
index af7906c9c..c24efad81 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/function.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/function.lux
@@ -108,5 +108,5 @@
(_.do "concat" (list @missing))))))))))))
)))]
_ (/////generation.execute! declaration)
- _ (/////generation.save! function_artifact declaration)]
+ _ (/////generation.save! function_artifact #.None declaration)]
(wrap instatiation)))
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/runtime.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/runtime.lux
index 2ce60a9a1..3e8e09d8c 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/runtime.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/ruby/runtime.lux
@@ -393,11 +393,12 @@
(Operation [Registry Output])
(do ///////phase.monad
[_ (/////generation.execute! ..runtime)
- _ (/////generation.save! ..module_id ..runtime)]
+ _ (/////generation.save! ..module_id #.None ..runtime)]
(wrap [(|> artifact.empty
artifact.resource
product.right)
(row.row [..module_id
+ #.None
(|> ..runtime
_.code
(\ utf8.codec encode))])])))
diff --git a/stdlib/source/library/lux/tool/compiler/meta/archive.lux b/stdlib/source/library/lux/tool/compiler/meta/archive.lux
index 735e315c5..39beec921 100644
--- a/stdlib/source/library/lux/tool/compiler/meta/archive.lux
+++ b/stdlib/source/library/lux/tool/compiler/meta/archive.lux
@@ -39,7 +39,7 @@
[version (#+ Version)]]])
(type: #export Output
- (Row [artifact.ID Binary]))
+ (Row [artifact.ID (Maybe Text) Binary]))
(exception: #export (unknown_document {module Module}
{known_modules (List Module)})
diff --git a/stdlib/source/library/lux/tool/compiler/meta/archive/artifact.lux b/stdlib/source/library/lux/tool/compiler/meta/archive/artifact.lux
index 33e09e51a..2c6deeb27 100644
--- a/stdlib/source/library/lux/tool/compiler/meta/archive/artifact.lux
+++ b/stdlib/source/library/lux/tool/compiler/meta/archive/artifact.lux
@@ -7,7 +7,7 @@
[pipe (#+ case>)]
["." exception (#+ exception:)]
["<>" parser
- ["<b>" binary (#+ Parser)]]]
+ ["<.>" binary (#+ Parser)]]]
[data
["." product]
["." text
@@ -30,7 +30,8 @@
(#Analyser Text)
(#Synthesizer Text)
(#Generator Text)
- (#Directive Text))
+ (#Directive Text)
+ (#Custom Text))
(type: #export Artifact
{#id ID
@@ -90,6 +91,7 @@
[#Synthesizer synthesizer synthesizers]
[#Generator generator generators]
[#Directive directive directives]
+ [#Custom custom customs]
)
(def: #export (remember name registry)
@@ -109,8 +111,9 @@
[1 #Definition binary.text]
[2 #Analyser binary.text]
[3 #Synthesizer binary.text]
- [4 #Generator binary.text]
- [5 #Directive binary.text]))))
+ [4 #Generator binary.text]
+ [5 #Directive binary.text]
+ [6 #Custom binary.text]))))
artifacts (: (Writer (Row Category))
(binary.row/64 category))]
(|>> :representation
@@ -126,16 +129,20 @@
(Parser Registry)
(let [category (: (Parser Category)
(do {! <>.monad}
- [tag <b>.nat]
+ [tag <binary>.nat]
(case tag
- 0 (\ ! map (|>> #Anonymous) <b>.any)
- 1 (\ ! map (|>> #Definition) <b>.text)
- 2 (\ ! map (|>> #Analyser) <b>.text)
- 3 (\ ! map (|>> #Synthesizer) <b>.text)
- 4 (\ ! map (|>> #Generator) <b>.text)
- 5 (\ ! map (|>> #Directive) <b>.text)
+ (^template [<nat> <tag> <parser>]
+ [<nat> (\ ! map (|>> <tag>) <parser>)])
+ ([0 #Anonymous <binary>.any]
+ [1 #Definition <binary>.text]
+ [2 #Analyser <binary>.text]
+ [3 #Synthesizer <binary>.text]
+ [4 #Generator <binary>.text]
+ [5 #Directive <binary>.text]
+ [6 #Custom <binary>.text])
+
_ (<>.fail (exception.construct ..invalid_category [tag])))))]
- (|> (<b>.row/64 category)
+ (|> (<binary>.row/64 category)
(\ <>.monad map (row\fold (function (_ artifact registry)
(product.right
(case artifact
@@ -149,7 +156,8 @@
[#Analyser ..analyser]
[#Synthesizer ..synthesizer]
[#Generator ..generator]
- [#Directive ..directive])
+ [#Directive ..directive]
+ [#Custom ..custom])
)))
..empty)))))
)
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 0b7a54a34..cd7b7169a 100644
--- a/stdlib/source/library/lux/tool/compiler/meta/io/archive.lux
+++ b/stdlib/source/library/lux/tool/compiler/meta/io/archive.lux
@@ -227,12 +227,12 @@
(case (do !
[data (try.from_maybe (dictionary.get (format (%.nat artifact_id) extension) actual))
#let [context [module_id artifact_id]
- directive (\ host ingest context data)
- output (row.add [artifact_id data] output)]]
+ directive (\ host ingest context data)]]
(case artifact_category
#artifact.Anonymous
(do !
- [_ (\ host re_learn context directive)]
+ [#let [output (row.add [artifact_id #.None data] output)]
+ _ (\ host re_learn context #.None directive)]
(wrap [definitions
[analysers
synthesizers
@@ -241,25 +241,27 @@
output]))
(#artifact.Definition name)
- (if (text\= $/program.name name)
- (wrap [definitions
- [analysers
- synthesizers
- generators
- directives]
- output])
- (do !
- [value (\ host re_load context directive)]
- (wrap [(dictionary.put name value definitions)
+ (let [output (row.add [artifact_id #.None data] output)]
+ (if (text\= $/program.name name)
+ (wrap [definitions
[analysers
synthesizers
generators
directives]
- output])))
+ output])
+ (do !
+ [value (\ host re_load context #.None directive)]
+ (wrap [(dictionary.put name value definitions)
+ [analysers
+ synthesizers
+ generators
+ directives]
+ output]))))
(#artifact.Analyser extension)
(do !
- [value (\ host re_load context directive)]
+ [#let [output (row.add [artifact_id #.None data] output)]
+ value (\ host re_load context #.None directive)]
(wrap [definitions
[(dictionary.put extension (:as analysis.Handler value) analysers)
synthesizers
@@ -269,7 +271,8 @@
(#artifact.Synthesizer extension)
(do !
- [value (\ host re_load context directive)]
+ [#let [output (row.add [artifact_id #.None data] output)]
+ value (\ host re_load context #.None directive)]
(wrap [definitions
[analysers
(dictionary.put extension (:as synthesis.Handler value) synthesizers)
@@ -279,7 +282,8 @@
(#artifact.Generator extension)
(do !
- [value (\ host re_load context directive)]
+ [#let [output (row.add [artifact_id #.None data] output)]
+ value (\ host re_load context #.None directive)]
(wrap [definitions
[analysers
synthesizers
@@ -289,12 +293,24 @@
(#artifact.Directive extension)
(do !
- [value (\ host re_load context directive)]
+ [#let [output (row.add [artifact_id #.None data] output)]
+ value (\ host re_load context #.None directive)]
(wrap [definitions
[analysers
synthesizers
generators
(dictionary.put extension (:as directive.Handler value) directives)]
+ output]))
+
+ (#artifact.Custom name)
+ (do !
+ [#let [output (row.add [artifact_id (#.Some name) data] output)]
+ value (\ host re_load context (#.Some name) directive)]
+ (wrap [definitions
+ [analysers
+ synthesizers
+ generators
+ directives]
output]))))
(#try.Success [definitions' bundles' output'])
(recur input' definitions' bundles' output')
diff --git a/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux b/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux
index f5366ab8e..7e79903d5 100644
--- a/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux
+++ b/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux
@@ -11,6 +11,7 @@
["." promise (#+ Promise)]]]
[data
["." binary (#+ Binary)]
+ ["." maybe ("#\." functor)]
["." text
["%" format (#+ format)]]
[collection
@@ -109,11 +110,13 @@
(java/util/jar/Attributes::put (java/util/jar/Attributes$Name::MANIFEST_VERSION) ..manifest_version))
manifest)))
-(def: (write_class static module artifact content sink)
- (-> Static archive.ID artifact.ID Binary java/util/jar/JarOutputStream
+(def: (write_class static module artifact custom content sink)
+ (-> Static archive.ID artifact.ID (Maybe Text) Binary java/util/jar/JarOutputStream
java/util/jar/JarOutputStream)
- (let [class_path (format (runtime.class_name [module artifact])
- (get@ #static.artifact_extension static))]
+ (let [class_path (|> custom
+ (maybe\map (|>> name.internal name.read))
+ (maybe.default (runtime.class_name [module artifact]))
+ (text.suffix (get@ #static.artifact_extension static)))]
(do_to sink
(java/util/jar/JarOutputStream::putNextEntry (java/util/jar/JarEntry::new class_path))
(java/util/zip/ZipOutputStream::write content +0 (.int (binary.size content)))
@@ -123,8 +126,8 @@
(def: (write_module static [module output] sink)
(-> Static [archive.ID Output] java/util/jar/JarOutputStream
java/util/jar/JarOutputStream)
- (row\fold (function (_ [artifact content] sink)
- (..write_class static module artifact content sink))
+ (row\fold (function (_ [artifact custom content] sink)
+ (..write_class static module artifact custom content sink))
sink
output))
diff --git a/stdlib/source/library/lux/tool/compiler/meta/packager/script.lux b/stdlib/source/library/lux/tool/compiler/meta/packager/script.lux
index ac2b5758c..36b1db690 100644
--- a/stdlib/source/library/lux/tool/compiler/meta/packager/script.lux
+++ b/stdlib/source/library/lux/tool/compiler/meta/packager/script.lux
@@ -33,30 +33,25 @@
["$" lux
[generation (#+ Context)]]]]]])
-## TODO: Delete ASAP
-(type: (Action ! a)
- (! (Try a)))
-
(def: (write_module sequence [module output] so_far)
(All [directive]
(-> (-> directive directive directive) [archive.ID Output] directive
(Try directive)))
(|> output
row.to_list
- (list\map product.right)
+ (list\map (|>> product.right product.right))
(monad.fold try.monad
(function (_ content so_far)
(|> content
(\ utf8.codec decode)
(\ try.monad map
- (function (_ content)
- (sequence so_far
- (:share [directive]
- directive
- so_far
-
- directive
- (:assume content)))))))
+ (|>> :assume
+ (:share [directive]
+ directive
+ so_far
+
+ directive)
+ (sequence so_far)))))
so_far)))
(def: #export (package header to_code sequence scope)
diff --git a/stdlib/source/library/lux/world/shell.lux b/stdlib/source/library/lux/world/shell.lux
index 52cd3efd4..ddfacbc5e 100644
--- a/stdlib/source/library/lux/world/shell.lux
+++ b/stdlib/source/library/lux/world/shell.lux
@@ -318,8 +318,8 @@
(: (-> s (Try [s Exit]))
on_await))
-(`` (implementation: (mock_process mock state)
- (All [s] (-> (Mock s) (Atom s) (Process IO)))
+(`` (implementation: (mock_process state mock)
+ (All [s] (-> (Atom s) (Mock s) (Process IO)))
(~~ (template [<name> <mock>]
[(def: (<name> _)
@@ -368,7 +368,7 @@
s
(Shell IO)))
- (def: (execute input)
- (io.io (do try.monad
- [mock (mock input)]
- (wrap (..mock_process mock (atom.atom init)))))))
+ (def: execute
+ (|>> mock
+ (\ try.monad map (..mock_process (atom.atom init)))
+ io.io)))
diff --git a/stdlib/source/program/aedifex/dependency/resolution.lux b/stdlib/source/program/aedifex/dependency/resolution.lux
index 15a32959b..1e0c522b9 100644
--- a/stdlib/source/program/aedifex/dependency/resolution.lux
+++ b/stdlib/source/program/aedifex/dependency/resolution.lux
@@ -234,12 +234,14 @@
///package.dependencies
(try\map set.to_list)
(try.default (list)))
- sub_repositories (|> package
- ///package.repositories
- (try\map set.to_list)
- (try.default (list))
- (list\map new_repository)
- (list\compose repositories))]
+ ## For security reasons, it's not a good idea to allow dependencies to introduce repositories.
+ ## package_repositories (|> package
+ ## ///package.repositories
+ ## (try\map set.to_list)
+ ## (try.default (list))
+ ## (list\map new_repository))
+ ## sub_repositories (list\compose repositories package_repositories)
+ sub_repositories repositories]
[successes failures resolution] (recur sub_repositories
(#.Cons head successes)
failures
diff --git a/stdlib/source/program/aedifex/pom.lux b/stdlib/source/program/aedifex/pom.lux
index 8f1dae1ea..c5756ee97 100644
--- a/stdlib/source/program/aedifex/pom.lux
+++ b/stdlib/source/program/aedifex/pom.lux
@@ -8,7 +8,7 @@
["." try (#+ Try)]
["." exception]
["<>" parser
- ["<xml>" xml (#+ Parser)]]]
+ ["<.>" xml (#+ Parser)]]]
[data
["." name]
["." maybe ("#\." functor)]
diff --git a/stdlib/source/test/aedifex/command/build.lux b/stdlib/source/test/aedifex/command/build.lux
index 1292c232f..4b0960d32 100644
--- a/stdlib/source/test/aedifex/command/build.lux
+++ b/stdlib/source/test/aedifex/command/build.lux
@@ -5,6 +5,7 @@
[abstract
[monad (#+ do)]]
[control
+ [pipe (#+ case>)]
[io (#+ IO)]
["." try]
["." exception]
@@ -72,6 +73,38 @@
(def: (on_await state)
(#try.Success [state shell.error]))))))))
+(def: #export (reader_shell error?)
+ (-> Bit (-> (List Text) (Shell IO)))
+ (shell.mock
+ (function (_ [actual_environment actual_working_directory actual_command actual_arguments])
+ (#try.Success
+ (: (shell.Mock (List Text))
+ (implementation
+ (def: (on_read state)
+ (if error?
+ (exception.throw shell.no_more_output [])
+ (case state
+ (#.Cons head tail)
+ (#try.Success [tail head])
+
+ #.Nil
+ (exception.throw shell.no_more_output []))))
+ (def: (on_error state)
+ (if error?
+ (case state
+ (#.Cons head tail)
+ (#try.Success [tail head])
+
+ #.Nil
+ (exception.throw shell.no_more_output []))
+ (exception.throw shell.no_more_output [])))
+ (def: (on_write input state)
+ (#try.Failure "on_write"))
+ (def: (on_destroy state)
+ (#try.Failure "on_destroy"))
+ (def: (on_await state)
+ (#try.Success [state shell.error]))))))))
+
(def: compiler
(Random Dependency)
(do random.monad
@@ -181,4 +214,39 @@
(text\= /.failure end))))]
(_.cover' [/.failure]
(try.default false verdict)))))
+ (do !
+ [expected/0 (random.ascii/alpha 5)
+ expected/1 (random.ascii/alpha 5)
+ expected/2 (random.ascii/alpha 5)]
+ (`` ($_ _.and
+ (~~ (template [<error?> <log!>]
+ [(let [console (@version.echo "")
+ shell (|> (list expected/0 expected/1 expected/2)
+ (..reader_shell <error?>)
+ shell.async)]
+ (wrap (do {! promise.monad}
+ [verdict (do ///action.monad
+ [process (shell [environment.empty working_directory "" (list "")])
+ _ (<log!> console process)
+ actual/0 (\ console read_line [])
+ actual/1 (\ console read_line [])
+ actual/2 (\ console read_line [])
+ end! (|> (\ console read_line [])
+ (\ ! map (|>> (case> (#try.Failure error)
+ true
+
+ (#try.Success _)
+ false)
+ #try.Success)))]
+ (wrap (and (text\= expected/0 actual/0)
+ (text\= expected/1 actual/1)
+ (text\= expected/2 actual/2)
+ end!)))]
+ (_.cover' [<log!>]
+ (try.default false verdict)))))]
+
+ [#0 /.log_output!]
+ [#1 /.log_error!]
+ ))
+ )))
))))
diff --git a/stdlib/source/test/aedifex/dependency.lux b/stdlib/source/test/aedifex/dependency.lux
index 7ce95f716..733e15710 100644
--- a/stdlib/source/test/aedifex/dependency.lux
+++ b/stdlib/source/test/aedifex/dependency.lux
@@ -5,7 +5,9 @@
[abstract
[monad (#+ do)]
[\\specification
- ["$." equivalence]]]
+ ["$." equivalence]
+ ["$." order]
+ ["$." hash]]]
[math
["." random (#+ Random)]]]]
[//
@@ -26,4 +28,8 @@
($_ _.and
(_.for [/.equivalence]
($equivalence.spec /.equivalence ..random))
+ (_.for [/.order]
+ ($order.spec /.order ..random))
+ (_.for [/.hash]
+ ($hash.spec /.hash ..random))
))))
diff --git a/stdlib/source/test/aedifex/dependency/status.lux b/stdlib/source/test/aedifex/dependency/status.lux
index f886c031f..64bb2f642 100644
--- a/stdlib/source/test/aedifex/dependency/status.lux
+++ b/stdlib/source/test/aedifex/dependency/status.lux
@@ -3,8 +3,12 @@
[lux #*
["_" test (#+ Test)]
[abstract
+ [monad (#+ do)]
[\\specification
["$." equivalence]]]
+ [data
+ ["." binary #_
+ ["#T" \\test]]]
[math
["." random (#+ Random) ("#\." monad)]]]]
["$." /// #_
@@ -31,4 +35,14 @@
($_ _.and
(_.for [/.equivalence]
($equivalence.spec /.equivalence ..random))
+
+ (do random.monad
+ [payload (binaryT.random 1)]
+ (_.cover [/.verified]
+ (case (/.verified payload)
+ (#/.Verified sha1 md5)
+ true
+
+ _
+ false)))
))))
diff --git a/stdlib/source/test/aedifex/profile.lux b/stdlib/source/test/aedifex/profile.lux
index c593f1706..7163ac780 100644
--- a/stdlib/source/test/aedifex/profile.lux
+++ b/stdlib/source/test/aedifex/profile.lux
@@ -14,7 +14,7 @@
[parser
["." cli]]]
[data
- ["." text]
+ ["." text ("#\." equivalence)]
[collection
["." set (#+ Set)]
["." dictionary (#+ Dictionary)]]]
@@ -144,9 +144,20 @@
(_.for [/.Distribution /.License /.SCM /.Organization
/.Email /.Developer /.Contributor /.Info
/.Source /.Target /.Name /.Profile]
- ($_ _.and
- (_.for [/.equivalence]
- ($equivalence.spec /.equivalence ..random))
- (_.for [/.monoid]
- ($monoid.spec /.equivalence /.monoid ..random))
- ))))
+ (`` ($_ _.and
+ (_.for [/.equivalence]
+ ($equivalence.spec /.equivalence ..random))
+ (_.for [/.monoid]
+ ($monoid.spec /.equivalence /.monoid ..random))
+
+ (_.cover [/.default]
+ (text\= "" /.default))
+ (_.cover [/.default_compiler]
+ (|> (\ /.monoid identity)
+ (get@ #/.compiler)
+ (is? /.default_compiler)))
+ (_.cover [/.default_target]
+ (|> (\ /.monoid identity)
+ (get@ #/.target)
+ (is? /.default_target)))
+ )))))
diff --git a/stdlib/source/test/aedifex/repository/identity.lux b/stdlib/source/test/aedifex/repository/identity.lux
index 74daecb4d..e19acde36 100644
--- a/stdlib/source/test/aedifex/repository/identity.lux
+++ b/stdlib/source/test/aedifex/repository/identity.lux
@@ -20,7 +20,7 @@
(def: #export test
Test
(<| (_.covering /._)
- (_.for [/.Identity]
+ (_.for [/.User /.Password /.Identity]
($_ _.and
(_.for [/.equivalence]
($equivalence.spec /.equivalence ..random))
diff --git a/stdlib/source/test/aedifex/runtime.lux b/stdlib/source/test/aedifex/runtime.lux
index 24745da4a..7d6d3f98b 100644
--- a/stdlib/source/test/aedifex/runtime.lux
+++ b/stdlib/source/test/aedifex/runtime.lux
@@ -3,7 +3,9 @@
[lux #*
["_" test (#+ Test)]
[abstract
- [monad (#+ do)]]
+ [monad (#+ do)]
+ [\\specification
+ ["$." equivalence]]]
[data
["." maybe ("#\." functor)]
["." text ("#\." equivalence)]
@@ -35,6 +37,9 @@
[path (random.ascii/alpha 5)
runtime ..random]
(`` ($_ _.and
+ (_.for [/.equivalence]
+ ($equivalence.spec /.equivalence ..random))
+
(~~ (template [<command>]
[(_.cover [/.default_java /.default_js /.default_python /.default_lua /.default_ruby]
(let [listing (|> (list /.default_java /.default_js /.default_python /.default_lua /.default_ruby)
diff --git a/stdlib/source/test/lux.lux b/stdlib/source/test/lux.lux
index 26924ef8e..1e9976f4e 100644
--- a/stdlib/source/test/lux.lux
+++ b/stdlib/source/test/lux.lux
@@ -19,7 +19,9 @@
[data
["." bit ("#\." equivalence)]
["." text ("#\." equivalence)
- ["%" format (#+ format)]]]
+ ["%" format (#+ format)]]
+ [collection
+ ["." list]]]
[macro
["." code ("#\." equivalence)]]
["." math
@@ -553,6 +555,38 @@
(n.= (n.* (inc expected_left) (dec expected_right))
(actual expected_left expected_right))))))
+(/.template: (!n/+ <left> <right>)
+ (n.+ <left> <right>))
+
+(def: for_template
+ Test
+ (`` ($_ _.and
+ (_.cover [/.template]
+ (let [bits (list (~~ (/.template [_]
+ [true]
+
+ [0] [1] [2]
+ )))]
+ (and (n.= 3 (list.size bits))
+ (list.every? (bit\= true) bits))))
+ (do random.monad
+ [left random.nat
+ right random.nat]
+ (_.cover [/.template:]
+ (n.= (n.+ left right)
+ (!n/+ left right))))
+ (do {! random.monad}
+ [sample (\ ! map (n.% 5) random.nat)]
+ (_.cover [/.^template]
+ (case sample
+ (/.^template [<case>]
+ [<case> true])
+ ([0] [1] [2] [3] [4])
+
+ _
+ false)))
+ )))
+
(def: test
Test
(<| (_.covering /._)
@@ -577,6 +611,7 @@
..for_type
..for_i64
..for_function
+ ..for_template
..sub_tests
)))