aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--documentation/bookmark/agriculture.md4
-rw-r--r--documentation/bookmark/ambient_computing.md4
-rw-r--r--documentation/bookmark/artificial_intelligence/differentiable_programming.md4
-rw-r--r--documentation/bookmark/business/luck/beating_the_odds.md4
-rw-r--r--documentation/bookmark/business/model.md1
-rw-r--r--documentation/bookmark/concurrency/synchronization.md4
-rw-r--r--documentation/bookmark/cryptography.md1
-rw-r--r--documentation/bookmark/culture/open_source.md4
-rw-r--r--documentation/bookmark/database/temporal.md4
-rw-r--r--documentation/bookmark/hardware/accelerator.md4
-rw-r--r--documentation/bookmark/law.md5
-rw-r--r--documentation/bookmark/machine_learning/deep/geometric.md4
-rw-r--r--documentation/bookmark/math.md4
-rw-r--r--documentation/bookmark/math/geometry/geometric_algebra.md5
-rw-r--r--documentation/bookmark/memory_management/garbage_collection.md4
-rw-r--r--documentation/bookmark/optimization/algorithm.md4
-rw-r--r--documentation/bookmark/optimization/simd.md1
-rw-r--r--documentation/bookmark/reversible_computing.md1
-rw-r--r--documentation/bookmark/rules_engine.md5
-rw-r--r--documentation/bookmark/security/auditing/bill_of_materials.md4
-rw-r--r--documentation/bookmark/security/verification/formal.md4
-rw-r--r--documentation/bookmark/software_engineering/negative.md4
-rw-r--r--documentation/bookmark/software_engineering/practice.md4
-rw-r--r--documentation/bookmark/tool/language_server_protocol.md4
-rw-r--r--documentation/bookmark/tool/read_eval_print_loop.md4
-rw-r--r--documentation/bookmark/user_interface/terminal.md4
-rw-r--r--documentation/bookmark/web_framework.md (renamed from documentation/bookmark/web-framework.md)4
-rw-r--r--lux-js/source/program.lux4
-rw-r--r--stdlib/source/library/lux/ffi.lux83
-rw-r--r--stdlib/source/library/lux/ffi.old.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/default/init.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js.lux2
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux2
-rw-r--r--stdlib/source/library/lux/world/file.lux2
-rw-r--r--stdlib/source/program/compositor.lux2
-rw-r--r--stdlib/source/test/lux/ffi.js.lux3
36 files changed, 186 insertions, 15 deletions
diff --git a/documentation/bookmark/agriculture.md b/documentation/bookmark/agriculture.md
new file mode 100644
index 000000000..f0c601722
--- /dev/null
+++ b/documentation/bookmark/agriculture.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Agrivoltaics: Opportunities for Agriculture and Energy Transition](https://agri-pv.org/en/)
+
diff --git a/documentation/bookmark/ambient_computing.md b/documentation/bookmark/ambient_computing.md
new file mode 100644
index 000000000..94ec0e56a
--- /dev/null
+++ b/documentation/bookmark/ambient_computing.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Hidden Interfaces for Ambient Computing](https://ai.googleblog.com/2022/04/hidden-interfaces-for-ambient-computing.html)
+
diff --git a/documentation/bookmark/artificial_intelligence/differentiable_programming.md b/documentation/bookmark/artificial_intelligence/differentiable_programming.md
index eb020fd78..69adc6a2f 100644
--- a/documentation/bookmark/artificial_intelligence/differentiable_programming.md
+++ b/documentation/bookmark/artificial_intelligence/differentiable_programming.md
@@ -1,3 +1,7 @@
+# Programming language
+
+0. [Myia](https://github.com/mila-iqia/myia)
+
# Reference
0. [Provably Correct, Asymptotically Efficient, Higher-Order Reverse-Mode Automatic Differentiation](https://www.cl.cam.ac.uk/~nk480/higher-order-ad.pdf)
diff --git a/documentation/bookmark/business/luck/beating_the_odds.md b/documentation/bookmark/business/luck/beating_the_odds.md
new file mode 100644
index 000000000..669e404c4
--- /dev/null
+++ b/documentation/bookmark/business/luck/beating_the_odds.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [No Time, No Budget, No Problem: Finishing The First Tree](https://www.youtube.com/watch?v=g5f7yixtQPc)
+
diff --git a/documentation/bookmark/business/model.md b/documentation/bookmark/business/model.md
index 7857523b8..464b05efc 100644
--- a/documentation/bookmark/business/model.md
+++ b/documentation/bookmark/business/model.md
@@ -1,4 +1,5 @@
# Reference
+0. [Hardware/Software Business Models](https://www.atomsandbits.io/p/hardware-software-business-models?s=r)
0. [Reciprocity as a Business Model: What motivates people to pay for services they receive?](https://briefthoughts.substack.com/p/reciprocity-as-a-business-model?s=r)
diff --git a/documentation/bookmark/concurrency/synchronization.md b/documentation/bookmark/concurrency/synchronization.md
new file mode 100644
index 000000000..4f31d3ccd
--- /dev/null
+++ b/documentation/bookmark/concurrency/synchronization.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [17. Synchronization Without Locks](https://www.youtube.com/watch?v=5sZo3SrLrGA)
+
diff --git a/documentation/bookmark/cryptography.md b/documentation/bookmark/cryptography.md
index 3ca80b480..888f94add 100644
--- a/documentation/bookmark/cryptography.md
+++ b/documentation/bookmark/cryptography.md
@@ -9,6 +9,7 @@
# Zero-knowledge proof
+0. [Hardware Acceleration for Zero Knowledge Proofs](https://www.paradigm.xyz/2022/04/zk-hardware)
0. ["Rhapsody in Zero Knowledge: Proving Without Revealing" by Tony Arcieri](https://www.youtube.com/watch?v=jKSz7W5dTgY)
0. [Zero-Knowledge Proofs: What are they, how do they work, and are they fast yet?](https://zkp.science/)
diff --git a/documentation/bookmark/culture/open_source.md b/documentation/bookmark/culture/open_source.md
new file mode 100644
index 000000000..5c87e8300
--- /dev/null
+++ b/documentation/bookmark/culture/open_source.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Entitlement in Open Source](https://blog.container-solutions.com/entitlement-in-open-source)
+
diff --git a/documentation/bookmark/database/temporal.md b/documentation/bookmark/database/temporal.md
new file mode 100644
index 000000000..46c9fe131
--- /dev/null
+++ b/documentation/bookmark/database/temporal.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Sign of the Times - Managing inhomogeneously bitemporal data with Datomic and Clojure](https://blog.podsnap.com/bitemp.html)
+
diff --git a/documentation/bookmark/hardware/accelerator.md b/documentation/bookmark/hardware/accelerator.md
new file mode 100644
index 000000000..3a84554ef
--- /dev/null
+++ b/documentation/bookmark/hardware/accelerator.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Calyx: A Compiler Infrastructure for Accelerator Generators](https://calyxir.org/)
+
diff --git a/documentation/bookmark/law.md b/documentation/bookmark/law.md
index d23c71951..20f99340d 100644
--- a/documentation/bookmark/law.md
+++ b/documentation/bookmark/law.md
@@ -1,5 +1,8 @@
# Reference
+0. [Reviewers Edition](https://reviewersedition.org/)
+0. [Legal Versioning: refined scheme for functional prose projects](https://writing.kemitchell.com/2022/05/28/Legal-Versioning)
+ 0. [Legal Versioning](https://legalversioning.com/)
0. [Catala: A Programming Language for the Law](https://arxiv.org/abs/2103.03198)
- 0. [Catala](https://github.com/CatalaLang/catala)
+ 0. [Catala](https://github.com/CatalaLang/catala)
diff --git a/documentation/bookmark/machine_learning/deep/geometric.md b/documentation/bookmark/machine_learning/deep/geometric.md
new file mode 100644
index 000000000..93de8ff17
--- /dev/null
+++ b/documentation/bookmark/machine_learning/deep/geometric.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Geometric Deep Learning](https://a-j.gitbook.io/geometric-deep-learning/)
+
diff --git a/documentation/bookmark/math.md b/documentation/bookmark/math.md
index 364f9944b..113ec69a7 100644
--- a/documentation/bookmark/math.md
+++ b/documentation/bookmark/math.md
@@ -85,6 +85,10 @@
# _Compendium of resources_
+0. [How to Learn Advanced Mathematics Without Heading to University - Part 1](https://www.quantstart.com/articles/How-to-Learn-Advanced-Mathematics-Without-Heading-to-University-Part-1/)
+ 0. [How to Learn Advanced Mathematics Without Heading to University - Part 2](https://www.quantstart.com/articles/How-to-Learn-Advanced-Mathematics-Without-Heading-to-University-Part-2/)
+ 0. [How to Learn Advanced Mathematics Without Heading to University - Part 3](https://www.quantstart.com/articles/How-to-Learn-Advanced-Mathematics-Without-Heading-to-University-Part-3/)
+ 0. [How to Learn Advanced Mathematics Without Heading to University - Part 4](https://www.quantstart.com/articles/how-to-learn-advanced-mathematics-without-heading-to-university-part-4/)
0. [Free and Open-Source Textbooks](http://danaernst.com/resources/free-and-open-source-textbooks/)
0. [ALL IN ONE MATHEMATICS CHEAT SHEET](https://ourway.keybase.pub/mathematics_cheat_sheet.pdf)
0. https://github.com/llSourcell/learn_math_fast
diff --git a/documentation/bookmark/math/geometry/geometric_algebra.md b/documentation/bookmark/math/geometry/geometric_algebra.md
index b83e0c698..2de56f32f 100644
--- a/documentation/bookmark/math/geometry/geometric_algebra.md
+++ b/documentation/bookmark/math/geometry/geometric_algebra.md
@@ -1,5 +1,8 @@
# Reference
+0. [Projective Geometric Algebra Done Right](http://terathon.com/blog/projective-geometric-algebra-done-right/)
+ 0. [Symmetries in Projective Geometric Algebra](http://terathon.com/blog/symmetries-in-projective-geometric-algebra/)
+0. [Projective Geometric Algebra](http://projectivegeometricalgebra.org/)
0. [A Swift Introduction to Geometric Algebra](https://www.youtube.com/watch?v=60z_hpEAtD8)
-0. [Addendum to A Swift Introduction to Geometric Algebra](https://www.youtube.com/watch?v=0bOiy0HVMqA)
+ 0. [Addendum to A Swift Introduction to Geometric Algebra](https://www.youtube.com/watch?v=0bOiy0HVMqA)
diff --git a/documentation/bookmark/memory_management/garbage_collection.md b/documentation/bookmark/memory_management/garbage_collection.md
new file mode 100644
index 000000000..9f938dcb1
--- /dev/null
+++ b/documentation/bookmark/memory_management/garbage_collection.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Summarizing Garbage Collection](https://eschew.wordpress.com/2016/09/02/summarizing-gc/)
+
diff --git a/documentation/bookmark/optimization/algorithm.md b/documentation/bookmark/optimization/algorithm.md
new file mode 100644
index 000000000..243ec7ab0
--- /dev/null
+++ b/documentation/bookmark/optimization/algorithm.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Efficient Algorithms](https://www.ifi.uzh.ch/en/dast/teaching/EA.html)
+
diff --git a/documentation/bookmark/optimization/simd.md b/documentation/bookmark/optimization/simd.md
index 02cef4b5f..fa90da369 100644
--- a/documentation/bookmark/optimization/simd.md
+++ b/documentation/bookmark/optimization/simd.md
@@ -1,4 +1,5 @@
# Reference
+0. [Closing the Performance Gap Between Lisp and C](https://zenodo.org/record/6335627#.YpzmCDnMJH5)
0. [Vectorization, dependencies and outer loop vectorization: if you can’t beat them, join them](https://johnysswlab.com/vectorization-dependencies-and-outer-loop-vectorization-if-you-cant-beat-them-join-them/)
diff --git a/documentation/bookmark/reversible_computing.md b/documentation/bookmark/reversible_computing.md
index ce6ce34c7..dced7f151 100644
--- a/documentation/bookmark/reversible_computing.md
+++ b/documentation/bookmark/reversible_computing.md
@@ -1,4 +1,5 @@
# Reference
+0. [Arrow: A Modern Reversible Programming Language](https://digitalcommons.oberlin.edu/cgi/viewcontent.cgi?article=1269&context=honors)
0. [Stanford Seminar - Generalized Reversible Computing and the Unconventional Computing Landscape](https://www.youtube.com/watch?v=IQZ_bQbxSXk)
diff --git a/documentation/bookmark/rules_engine.md b/documentation/bookmark/rules_engine.md
new file mode 100644
index 000000000..e8d9c2ebb
--- /dev/null
+++ b/documentation/bookmark/rules_engine.md
@@ -0,0 +1,5 @@
+# Reference
+
+0. [Evrete](https://www.evrete.org/)
+0. [OptaPlanner: Solve planning and scheduling problems with OptaPlanner](https://www.optaplanner.org/)
+
diff --git a/documentation/bookmark/security/auditing/bill_of_materials.md b/documentation/bookmark/security/auditing/bill_of_materials.md
new file mode 100644
index 000000000..5f6ec4f4e
--- /dev/null
+++ b/documentation/bookmark/security/auditing/bill_of_materials.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Not All SBOMs Are Created Equal](https://blog.chainguard.dev/not-all-sboms-are-created-equal/)
+
diff --git a/documentation/bookmark/security/verification/formal.md b/documentation/bookmark/security/verification/formal.md
new file mode 100644
index 000000000..ed59c673a
--- /dev/null
+++ b/documentation/bookmark/security/verification/formal.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Verifying Dynamic Trait Objects in Rust](https://www.cs.cornell.edu/~avh/dyn-trait-icse-seip-2022-preprint.pdf)
+
diff --git a/documentation/bookmark/software_engineering/negative.md b/documentation/bookmark/software_engineering/negative.md
new file mode 100644
index 000000000..fa6581c9b
--- /dev/null
+++ b/documentation/bookmark/software_engineering/negative.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [What Is Negative Engineering?](https://future.com/negative-engineering-and-the-art-of-failing-successfully/)
+
diff --git a/documentation/bookmark/software_engineering/practice.md b/documentation/bookmark/software_engineering/practice.md
new file mode 100644
index 000000000..bedcd49f3
--- /dev/null
+++ b/documentation/bookmark/software_engineering/practice.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Thinking of commits like code](https://www.scottantipa.com/thinking-of-commits-like-code.html)
+
diff --git a/documentation/bookmark/tool/language_server_protocol.md b/documentation/bookmark/tool/language_server_protocol.md
new file mode 100644
index 000000000..89246ea39
--- /dev/null
+++ b/documentation/bookmark/tool/language_server_protocol.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Why LSP?](https://matklad.github.io//2022/04/25/why-lsp.html)
+
diff --git a/documentation/bookmark/tool/read_eval_print_loop.md b/documentation/bookmark/tool/read_eval_print_loop.md
new file mode 100644
index 000000000..6d71c3e53
--- /dev/null
+++ b/documentation/bookmark/tool/read_eval_print_loop.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [reple: "Replay-based" REPLs for compiled languages.](https://github.com/BenBrock/reple)
+
diff --git a/documentation/bookmark/user_interface/terminal.md b/documentation/bookmark/user_interface/terminal.md
new file mode 100644
index 000000000..15a6adf32
--- /dev/null
+++ b/documentation/bookmark/user_interface/terminal.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Textualize](https://www.textualize.io/)
+
diff --git a/documentation/bookmark/web-framework.md b/documentation/bookmark/web_framework.md
index 71145e190..d98eb95e7 100644
--- a/documentation/bookmark/web-framework.md
+++ b/documentation/bookmark/web_framework.md
@@ -1,3 +1,7 @@
+# State
+
+0. [Jotai: Primitive and flexible state management for React](https://jotai.org/)
+
# Virtual DOM
0. [Virtual DOM is pure overhead](https://svelte.dev/blog/virtual-dom-is-pure-overhead)
diff --git a/lux-js/source/program.lux b/lux-js/source/program.lux
index f6aecd2e0..ec49efe41 100644
--- a/lux-js/source/program.lux
+++ b/lux-js/source/program.lux
@@ -33,7 +33,7 @@
["[0]" world
["[0]" file]
["[1]/[0]" program]]
- ["@" target
+ ["@" target (.only)
["_" js]]
[tool
[compiler
@@ -55,7 +55,7 @@
["[1]" js]]]
[generation
["[0]" reference]
- ["[0]" js
+ ["[0]" js (.only)
["[0]" runtime]]]]]]
[default
["[0]" platform (.only Platform)]]
diff --git a/stdlib/source/library/lux/ffi.lux b/stdlib/source/library/lux/ffi.lux
index 46475ae7d..1ff34a943 100644
--- a/stdlib/source/library/lux/ffi.lux
+++ b/stdlib/source/library/lux/ffi.lux
@@ -1,13 +1,13 @@
(.using
[library
- [lux (.except Symbol Alias Global global function type_of)
- ["@" target]
+ [lux (.except Symbol Alias Global global function type_of undefined)
["[0]" meta]
[abstract
[monad (.only do)]]
[control
["[0]" io]
["[0]" maybe (.open: "[1]#[0]" functor)]
+ ["[0]" try]
["<>" parser (.open: "[1]#[0]" monad)
["<[0]>" code (.only Parser)]]]
[data
@@ -20,6 +20,8 @@
[syntax (.only syntax:)]
["[0]" code]
["[0]" template]]
+ ["@" target (.only)
+ ["[0]" js]]
[type
[primitive (.except)]]]])
@@ -334,7 +336,7 @@
{#Procedure (Named Procedure)}
{#Global Global}))
- (def: import
+ (def: importP
(Parser Import)
(all <>.or
..class
@@ -558,7 +560,7 @@
(virtual_method_definition class alias namespace (the #member it))))
(syntax: .public (import [host_module (<>.maybe <code>.text)
- it ..import])
+ it ..importP])
(let [host_module_import! (is (List Code)
(case host_module
{.#Some host_module}
@@ -670,6 +672,77 @@
(as Text)
(text#= "[object process]")))
(maybe.else false)))
- )
+
+ ... These extensions must be defined this way because importing any of the modules
+ ... normally used when writing extensions would introduce a circular dependency
+ ... because the Archive type depends on Binary, and that module depends on this ffi module.
+ (syntax: (extension_name [])
+ (do meta.monad
+ [module meta.current_module_name
+ unique_id meta.seed]
+ (in (list (code.text (%.format module " " (%.nat unique_id)))))))
+
+ (with_expansions [<undefined> (..extension_name)
+ <undefined?> (..extension_name)]
+ (these (template: (extension_call <name> <parameter>)
+ [{5 #1 [<name> <parameter>]}])
+
+ (template: (analysis <name> <bindings> <parser> <inputs> <body>)
+ [("lux def analysis" <name>
+ (.function (_ name phase archive inputs)
+ (.function (_ state)
+ (let [<bindings> [name phase archive state]]
+ (case (<code>.result <parser> inputs)
+ {try.#Failure error}
+ {try.#Failure (%.format "Invalid inputs for extension: " (%.text name)
+ text.\n error)}
+
+ {try.#Success <inputs>}
+ <body>)))))])
+
+ (template: (generation <name> <bindings> <inputs> <body>)
+ [("lux def generation" <name>
+ (.function (_ name phase archive inputs)
+ (.function (_ state)
+ (let [<bindings> [name phase archive state]]
+ (`` (case inputs
+ (pattern (list (~~ (template.spliced <inputs>))))
+ <body>
+
+ _
+ {try.#Failure (%.format "Invalid inputs for extension: " (%.text name))}))))))])
+
+ (analysis <undefined>
+ [name phase archive state]
+ <code>.end
+ _
+ {try.#Success [state (extension_call name (list))]})
+
+ (generation <undefined>
+ [name phase archive state]
+ []
+ {try.#Success [state js.undefined]})
+
+ (template: .public (undefined)
+ [(.is .Any (<undefined>))])
+
+ (analysis <undefined?>
+ [name phase archive state]
+ <code>.any
+ it
+ (do try.monad
+ [[state it] (phase archive it state)]
+ (in [state (extension_call name (list it))])))
+
+ (generation <undefined?>
+ [name phase archive state]
+ [it]
+ (do try.monad
+ [[state it] (phase archive it state)]
+ (in [state (js.= js.undefined it)])))
+
+ (template: .public (undefined? <it>)
+ [(.as .Bit (.is .Any (<undefined?> (.is .Any <it>))))])
+ )))
(these))
)
diff --git a/stdlib/source/library/lux/ffi.old.lux b/stdlib/source/library/lux/ffi.old.lux
index 1d2603f79..951d58f18 100644
--- a/stdlib/source/library/lux/ffi.old.lux
+++ b/stdlib/source/library/lux/ffi.old.lux
@@ -10,7 +10,7 @@
["[0]" io]
["[0]" maybe]
["[0]" try (.only Try)]
- ["<>" parser
+ ["<>" parser (.only)
["<[0]>" code (.only Parser)]]]
[data
["[0]" product]
diff --git a/stdlib/source/library/lux/tool/compiler/default/init.lux b/stdlib/source/library/lux/tool/compiler/default/init.lux
index 6ddca02cf..c253743dd 100644
--- a/stdlib/source/library/lux/tool/compiler/default/init.lux
+++ b/stdlib/source/library/lux/tool/compiler/default/init.lux
@@ -49,7 +49,7 @@
[meta
["[0]" archive (.only Archive)
["[0]" registry (.only Registry)]
- ["[0]" module
+ ["[0]" module (.only)
["[0]" descriptor]
["[0]" document]]]]]])
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js.lux
index 02540a965..fa1cabf00 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js.lux
@@ -20,7 +20,7 @@
["/[1]" //
["[1][0]" reference]
["/[1]" //
- ["[1][0]" extension
+ ["[1][0]" extension (.only)
[generation
[js
["[1]/[0]" common]]]]
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 532f3c826..c8f77a38e 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
@@ -1,6 +1,6 @@
(.using
[library
- [lux (.except i64)
+ [lux (.except i64 left right)
["[0]" meta]
[abstract
["[0]" monad (.only do)]]
diff --git a/stdlib/source/library/lux/world/file.lux b/stdlib/source/library/lux/world/file.lux
index cfbc7ce2c..e88322775 100644
--- a/stdlib/source/library/lux/world/file.lux
+++ b/stdlib/source/library/lux/world/file.lux
@@ -24,7 +24,7 @@
["[0]" array (.only Array)]
["[0]" list (.open: "[1]#[0]" functor)]
["[0]" dictionary (.only Dictionary)]]]
- ["[0]" ffi
+ ["[0]" ffi (.only)
(~~ (.for "JavaScript" (~~ (.these ["[0]" node_js]))
"{old}" (~~ (.these ["node_js" //control/thread]))
(~~ (.these))))]
diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux
index 986e1f161..cd6a49dbb 100644
--- a/stdlib/source/program/compositor.lux
+++ b/stdlib/source/program/compositor.lux
@@ -36,7 +36,7 @@
["[0]" syntax]
["[0]" generation]
["[0]" directive]
- ["[0]" analysis
+ ["[0]" analysis (.only)
[macro (.only Expander)]]
[phase
[extension (.only Extender)]]]]
diff --git a/stdlib/source/test/lux/ffi.js.lux b/stdlib/source/test/lux/ffi.js.lux
index fa58458ae..6fe42ec08 100644
--- a/stdlib/source/test/lux/ffi.js.lux
+++ b/stdlib/source/test/lux/ffi.js.lux
@@ -143,6 +143,9 @@
(|> (TextDecoder::new encoding)
(TextDecoder::decode binary)))
))))
+ (_.coverage [/.undefined /.undefined?]
+ (and (not (/.undefined? number))
+ (/.undefined? (/.undefined))))
$/export.test
)))))