aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Julian2022-10-01 16:33:20 -0400
committerEduardo Julian2022-10-01 16:33:20 -0400
commit53704218a3705132dbe807a8ef54f938809f84d5 (patch)
tree44d03d90f4f6f8055fba226e23755edbb3c55318
parent1f4557bf0d904231b3b8d2b2bf73c35e9caead48 (diff)
New format for extensions [part 0]
-rw-r--r--lux-js/source/program.lux33
-rw-r--r--lux-jvm/source/program.lux12
-rw-r--r--lux-lua/source/program.lux19
-rw-r--r--lux-python/source/program.lux14
-rw-r--r--lux-ruby/source/program.lux19
-rw-r--r--stdlib/source/library/lux.lux3
-rw-r--r--stdlib/source/library/lux/meta/compiler/default/init.lux16
-rw-r--r--stdlib/source/library/lux/meta/compiler/default/platform.lux51
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux4
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux3
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis.lux8
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux24
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux275
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux48
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux83
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux10
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux4
-rw-r--r--stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux25
-rw-r--r--stdlib/source/library/lux/meta/extension.lux33
-rw-r--r--stdlib/source/library/lux/meta/type/check.lux12
-rw-r--r--stdlib/source/library/lux/meta/type/unit.lux1
-rw-r--r--stdlib/source/program/compositor.lux4
-rw-r--r--stdlib/source/test/lux/meta/extension.lux43
23 files changed, 422 insertions, 322 deletions
diff --git a/lux-js/source/program.lux b/lux-js/source/program.lux
index 665b4e8aa..ad7ee51f7 100644
--- a/lux-js/source/program.lux
+++ b/lux-js/source/program.lux
@@ -627,21 +627,18 @@
(..evaluate! context (_.var (reference.artifact context)))))))))
))
-(def (phase_wrapper archive)
- (-> Archive (runtime.Operation phase.Wrapper))
- (do phase.monad
- []
- (in (as phase.Wrapper
- (for @.jvm
- ... The implementation for @.jvm is technically incorrect.
- ... However, the JS compiler runs fast enough on Node to be fully hosted there.
- ... And running the JS compiler on the JVM (on top of Nashorn) is impractically slow.
- ... This means that in practice, only the @.js implementation matters.
- ... And since no cross-language boundary needs to be handled, it's a correct implementation.
- (|>>)
-
- @.js
- (|>>))))))
+(def phase_wrapper
+ phase.Wrapper
+ (for @.jvm
+ ... The implementation for @.jvm is technically incorrect.
+ ... However, the JS compiler runs fast enough on Node to be fully hosted there.
+ ... And running the JS compiler on the JVM (on top of Nashorn) is impractically slow.
+ ... This means that in practice, only the @.js implementation matters.
+ ... And since no cross-language boundary needs to be handled, it's a correct implementation.
+ (|>>)
+
+ @.js
+ (|>>)))
(def platform
(IO (Platform [Register Text] _.Expression _.Statement))
@@ -676,8 +673,8 @@
(_.string "")))))
(for @.jvm
- (def (extender phase_wrapper)
- (-> phase.Wrapper Extender)
+ (def extender
+ Extender
... TODO: Stop relying on coercions ASAP.
(<| (as Extender)
(function (@self handler))
@@ -735,7 +732,7 @@
analysis.bundle
(io.io platform)
generation.bundle
- (function.constant extension/bundle.empty)
+ extension/bundle.empty
..lux_program
(reference.constant js/reference.system)
[(And Register Text) _.Expression _.Statement]
diff --git a/lux-jvm/source/program.lux b/lux-jvm/source/program.lux
index 85b517bbd..e87263ce8 100644
--- a/lux-jvm/source/program.lux
+++ b/lux-jvm/source/program.lux
@@ -106,9 +106,9 @@
(ffi.write! 1 (as java/lang/Object lux)))
apply_method))))
-(def (phase_wrapper archive)
- (-> Archive (Operation Anchor (Bytecode Any) Definition phase.Wrapper))
- (at phase.monad in (|>>)))
+(def phase_wrapper
+ phase.Wrapper
+ (|>>))
(def .public platform
(IO [java/lang/ClassLoader
@@ -127,8 +127,8 @@
platform.#phase_wrapper ..phase_wrapper
platform.#write product.right]])))
-(def (extender phase_wrapper)
- (-> phase.Wrapper extension.Extender)
+(def extender
+ extension.Extender
... TODO: Stop relying on coercions ASAP.
(<| (as extension.Extender)
(function (@self handler))
@@ -175,7 +175,7 @@
(analysis.bundle loader host)
(io.io platform)
generation.bundle
- (|>> ..extender (declaration.bundle loader))
+ (declaration.bundle loader ..extender)
(/program.program /runtime.class_name)
/reference.constant
[Anchor (type_literal (Bytecode Any)) Definition]
diff --git a/lux-lua/source/program.lux b/lux-lua/source/program.lux
index 8a88b7d79..fb07a4fff 100644
--- a/lux-lua/source/program.lux
+++ b/lux-lua/source/program.lux
@@ -798,8 +798,8 @@
))
(as java/lang/Object it))))
- (def (extender [state_context executor] phase_wrapper)
- (-> Baggage (-> phase.Wrapper Extender))
+ (def (extender [state_context executor])
+ (-> Baggage Extender)
... TODO: Stop relying on coercions ASAP.
(<| (as Extender)
(function (@self handler))
@@ -836,14 +836,11 @@
(-> phase.Wrapper Extender)
(as_expected handler))))
-(def (phase_wrapper archive)
- (-> Archive (runtime.Operation phase.Wrapper))
- (do phase.monad
- []
- (in (as phase.Wrapper
- (for @.old (..lua_function ..to_host)
- @.jvm (..lua_function ..to_host)
- @.lua (|>>))))))
+(def phase_wrapper
+ phase.Wrapper
+ (for @.old (..lua_function ..to_host)
+ @.jvm (..lua_function ..to_host)
+ @.lua (|>>)))
(with_expansions [<jvm> (def platform
(IO [Baggage (Platform [Register _.Label] _.Expression _.Statement)])
@@ -901,7 +898,7 @@
analysis.bundle
(io.io platform)
generation.bundle
- (function.constant extension/bundle.empty)
+ extension/bundle.empty
..lux_program
(reference.constant lua/reference.system)
[(type_literal [Register _.Label])
diff --git a/lux-python/source/program.lux b/lux-python/source/program.lux
index f3dbc436c..e89d8b93c 100644
--- a/lux-python/source/program.lux
+++ b/lux-python/source/program.lux
@@ -492,8 +492,8 @@
[_ (execute! content)]
(evaluate! context (_.var (reference.artifact context)))))))))))))
-(with_expansions [<jvm> (these (def (extender phase_wrapper)
- (-> phase.Wrapper Extender)
+(with_expansions [<jvm> (these (def extender
+ Extender
... TODO: Stop relying on coercions ASAP.
(<| (as Extender)
(function (_ handler))
@@ -524,11 +524,9 @@
(-> phase.Wrapper Extender)
(as_expected handler))))
-(def (phase_wrapper archive)
- (-> Archive (runtime.Operation phase.Wrapper))
- (|> (..pseudo_function ..to_host)
- (as phase.Wrapper)
- phase#in))
+(def phase_wrapper
+ phase.Wrapper
+ (..pseudo_function ..to_host))
(def platform
(IO (Platform Register (_.Expression Any) (_.Statement Any)))
@@ -590,7 +588,7 @@
analysis.bundle
..platform
generation.bundle
- (function.constant extension/bundle.empty)
+ extension/bundle.empty
..lux_program
(reference.constant python/reference.system)
[Register
diff --git a/lux-ruby/source/program.lux b/lux-ruby/source/program.lux
index b729daa3a..14f5fa2c7 100644
--- a/lux-ruby/source/program.lux
+++ b/lux-ruby/source/program.lux
@@ -11,7 +11,6 @@
["[0]" try (.only Try)]
["[0]" exception (.only Exception)]
["[0]" io (.only IO io)]
- ["[0]" function]
[concurrency
["[0]" async (.only Async)]]]
[data
@@ -779,6 +778,11 @@
[_ (run! content)]
(run! (_.global (reference.artifact context))))))))))
+(def phase_wrapper
+ phase.Wrapper
+ (for @.jvm (..host_phase (list))
+ @.ruby (|>>)))
+
(for @.jvm (these (exception.def .public (invaid_phase_application [partial_application arity])
(Exception [(List Any) (List Any)])
(exception.report
@@ -924,8 +928,8 @@
(exception.except ..invaid_phase_application [partial_application inputs])))))]
(org/jruby/RubyProc::newProc (!ruby_runtime) block ..proc_type)))
- (def (extender phase_wrapper)
- (-> phase.Wrapper Extender)
+ (def extender
+ Extender
... TODO: Stop relying on coercions ASAP.
(<| (as Extender)
(function (@self handler))
@@ -956,13 +960,6 @@
(-> phase.Wrapper Extender)
(as_expected handler)))
-(def (phase_wrapper archive)
- (-> Archive (runtime.Operation phase.Wrapper))
- (<| phase#in
- (as phase.Wrapper)
- (for @.jvm (..host_phase (list))
- @.ruby (|>>))))
-
(def platform
(IO (Platform Register _.Expression _.Statement))
(do io.monad
@@ -1005,7 +1002,7 @@
analysis.bundle
..platform
generation.bundle
- (function.constant extension/bundle.empty)
+ extension/bundle.empty
..lux_program
(reference.constant ruby/reference.system)
[Register _.Expression _.Statement]
diff --git a/stdlib/source/library/lux.lux b/stdlib/source/library/lux.lux
index 8a829ae10..62a51de98 100644
--- a/stdlib/source/library/lux.lux
+++ b/stdlib/source/library/lux.lux
@@ -5877,3 +5877,6 @@
_
(failure (..wrong_syntax_error (symbol ..Rec)))))))
+
+(def .public Generation
+ (Primitive "#Generation"))
diff --git a/stdlib/source/library/lux/meta/compiler/default/init.lux b/stdlib/source/library/lux/meta/compiler/default/init.lux
index 7cf349a43..128e66ae2 100644
--- a/stdlib/source/library/lux/meta/compiler/default/init.lux
+++ b/stdlib/source/library/lux/meta/compiler/default/init.lux
@@ -53,29 +53,31 @@
["[0]" descriptor]
["[0]" document]]]]]])
-(def .public (state target module configuration expander host_analysis host generate generation_bundle)
+(def .public (state target module configuration extender expander anchor,expression,declaration host_analysis host generate generation_bundle)
(All (_ anchor expression declaration)
(-> Target
descriptor.Module
Configuration
- Expander
+ Extender Expander
+ [Type Type Type]
///analysis.Bundle
(///generation.Host expression declaration)
- (///generation.Phase anchor expression declaration)
+ (-> Extender Lux (///generation.Phase anchor expression declaration))
(///generation.Bundle anchor expression declaration)
(///declaration.State+ anchor expression declaration)))
(let [synthesis_state [synthesisE.bundle ///synthesis.init]
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.latest target configuration))]]
+ lux (///analysis.state (///analysis.info version.latest target configuration))
+ eval (///analysis/evaluation.evaluator expander synthesis_state generation_state (generate extender lux))
+ analysis_state [(analysisE.bundle eval anchor,expression,declaration host_analysis)
+ lux]]
[extension.empty
[///declaration.#analysis [///declaration.#state analysis_state
///declaration.#phase (analysisP.phase expander)]
///declaration.#synthesis [///declaration.#state synthesis_state
///declaration.#phase synthesisP.phase]
///declaration.#generation [///declaration.#state generation_state
- ///declaration.#phase generate]]]))
+ ///declaration.#phase (generate extender)]]]))
(def .public (with_default_declarations expander host_analysis program anchorT,expressionT,declarationT extender)
(All (_ anchor expression declaration)
diff --git a/stdlib/source/library/lux/meta/compiler/default/platform.lux b/stdlib/source/library/lux/meta/compiler/default/platform.lux
index 427625283..af7fef44e 100644
--- a/stdlib/source/library/lux/meta/compiler/default/platform.lux
+++ b/stdlib/source/library/lux/meta/compiler/default/platform.lux
@@ -78,9 +78,9 @@
(Record
[#file_system (file.System Async)
#host (///generation.Host expression declaration)
- #phase (///generation.Phase <type_vars>)
+ #phase (-> Extender Lux (///generation.Phase <type_vars>))
#runtime (<Operation> [Registry Output])
- #phase_wrapper (-> Archive (<Operation> ///phase.Wrapper))
+ #phase_wrapper ///phase.Wrapper
#write (-> declaration Binary)]))
... TODO: Get rid of this
@@ -223,18 +223,9 @@
(///phase.result' state)
(at try.monad each product.left)))
- (def (phase_wrapper archive platform state)
+ (def (complete_extensions host_declaration_bundle [analysers synthesizers generators declarations])
(All (_ <type_vars>)
- (-> Archive <Platform> <State+> (Try [<State+> ///phase.Wrapper])))
- (|> archive
- ((the #phase_wrapper platform))
- ///declaration.lifted_generation
- (///phase.result' state)))
-
- (def (complete_extensions host_declaration_bundle phase_wrapper [analysers synthesizers generators declarations])
- (All (_ <type_vars>)
- (-> (-> ///phase.Wrapper (///declaration.Bundle <type_vars>))
- ///phase.Wrapper
+ (-> (///declaration.Bundle <type_vars>)
[(Dictionary Text ///analysis.Handler)
(Dictionary Text ///synthesis.Handler)
(Dictionary Text (///generation.Handler <type_vars>))
@@ -246,9 +237,9 @@
[analysers
synthesizers
generators
- (dictionary.composite declarations (host_declaration_bundle phase_wrapper))])
+ (dictionary.composite declarations host_declaration_bundle)])
- (def .public (initialize context module expander host_analysis platform generation_bundle host_declaration_bundle program anchorT,expressionT,declarationT extender
+ (def .public (initialize context module expander host_analysis platform generation_bundle host_declaration_bundle program anchor,expression,declaration extender
import compilation_sources compilation_configuration)
(All (_ <type_vars>)
(-> context.Context
@@ -257,16 +248,19 @@
///analysis.Bundle
<Platform>
<Bundle>
- (-> ///phase.Wrapper (///declaration.Bundle <type_vars>))
+ (///declaration.Bundle <type_vars>)
(Program expression declaration)
- [Type Type Type] (-> ///phase.Wrapper Extender)
+ [Type Type Type] Extender
Import (List _io.Context) Configuration
(Async (Try [<State+> Archive ///phase.Wrapper]))))
(do [! ..monad]
- [.let [state (//init.state (the context.#host context)
+ [.let [phase_wrapper (the #phase_wrapper platform)
+ state (//init.state (the context.#host context)
module
compilation_configuration
+ extender
expander
+ anchor,expression,declaration
host_analysis
(the #host platform)
(the #phase platform)
@@ -277,20 +271,17 @@
.let [with_missing_extensions
(is (All (_ <type_vars>)
(-> <Platform> (Program expression declaration) <State+>
- (Async (Try [///phase.Wrapper <State+>]))))
+ (Async (Try <State+>))))
(function (_ platform program state)
- (async#in
- (do try.monad
- [[state phase_wrapper] (..phase_wrapper archive platform state)]
- (|> state
- (initialize_state (extender phase_wrapper)
- (as_expected (..complete_extensions host_declaration_bundle phase_wrapper (as_expected bundles)))
- analysis_state)
- (try#each (|>> (//init.with_default_declarations expander host_analysis program anchorT,expressionT,declarationT (extender phase_wrapper))
- [phase_wrapper])))))))]]
+ (|> state
+ (initialize_state extender
+ (as_expected (..complete_extensions host_declaration_bundle (as_expected bundles)))
+ analysis_state)
+ (try#each (//init.with_default_declarations expander host_analysis program anchor,expression,declaration extender))
+ async#in)))]]
(if (archive.archived? archive descriptor.runtime)
(do !
- [[phase_wrapper state] (with_missing_extensions platform program state)]
+ [state (with_missing_extensions platform program state)]
(in [state archive phase_wrapper]))
(do !
[[state [archive payload]] (|> (..process_runtime archive platform)
@@ -298,7 +289,7 @@
async#in)
_ (..cache_module context platform 0 $.key $.format payload)
- [phase_wrapper state] (with_missing_extensions platform program state)]
+ state (with_missing_extensions platform program state)]
(in [state archive phase_wrapper])))))
(def compilation_log_separator
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux b/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux
index 8eff3ed65..822c33d1d 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/declaration.lux
@@ -33,7 +33,7 @@
#synthesis (Component synthesis.State+
synthesis.Phase)
#generation (Component (generation.State+ anchor expression declaration)
- (generation.Phase anchor expression declaration))]))
+ (-> Lux (generation.Phase anchor expression declaration)))]))
(type .public Import
(Record
@@ -75,7 +75,7 @@
[analysis ..#analysis analysis.Phase]
[synthesis ..#synthesis synthesis.Phase]
- [generation ..#generation (generation.Phase anchor expression declaration)]
+ [generation ..#generation (-> Lux (generation.Phase anchor expression declaration))]
)
(with_template [<name> <component> <operation>]
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux
index 832944c9c..4cd838c6f 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/declaration.lux
@@ -89,7 +89,8 @@
(evaluation.evaluator expander
(the [//extension.#state /.#synthesis /.#state] state)
(the [//extension.#state /.#generation /.#state] state)
- (the [//extension.#state /.#generation /.#phase] state)))
+ ((the [//extension.#state /.#generation /.#phase] state)
+ (the [//extension.#state /.#analysis /.#state //extension.#state] state))))
extension_eval (as Eval (wrapper (as_expected compiler_eval)))]
_ (//.with (has [//extension.#state /.#analysis /.#state //extension.#state .#eval] extension_eval state))]
(when code
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis.lux
index 2a887e12d..d74041df9 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis.lux
@@ -10,7 +10,7 @@
["[0]" /
["[1][0]" lux]])
-(def .public (bundle eval host_specific)
- (-> Eval Bundle Bundle)
- (dictionary.composite host_specific
- (/lux.bundle eval)))
+(def .public (bundle eval anchor,expression,declaration host_specific)
+ (-> Eval [Type Type Type] Bundle Bundle)
+ (|> (/lux.bundle eval anchor,expression,declaration)
+ (dictionary.composite host_specific)))
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux
index da97565c2..f2e202be9 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/analysis/lux.lux
@@ -31,6 +31,7 @@
["[1][0]" analysis (.only Analysis Operation Phase Handler Bundle)
[evaluation (.only Eval)]
["[0]A" type]]
+ ["[0]" generation]
[///
["[1]" phase]
[meta
@@ -273,8 +274,26 @@
(///bundle.install "clip" (trinary Nat Nat Text Text))
)))
-(def .public (bundle eval)
- (-> Eval Bundle)
+(def (generation_extension [anchor expression declaration])
+ (-> [Type Type Type] Handler)
+ (..custom
+ [<code>.any
+ (function (_ extension_name phase archive [it])
+ (do [! ////.monad]
+ [it (<| (typeA.expecting (type_literal (generation.Handler anchor expression declaration)))
+ (phase archive it))
+ _ (typeA.inference .Generation)]
+ (in it)))]))
+
+(def (extension anchor,expression,declaration)
+ (-> [Type Type Type] Bundle)
+ (<| (///bundle.prefix "extension")
+ (|> ///bundle.empty
+ (///bundle.install "generation" (generation_extension anchor,expression,declaration))
+ )))
+
+(def .public (bundle eval anchor,expression,declaration)
+ (-> Eval [Type Type Type] Bundle)
(<| (///bundle.prefix "lux")
(|> ///bundle.empty
(dictionary.composite (bundle::lux eval))
@@ -282,4 +301,5 @@
(dictionary.composite bundle::f64)
(dictionary.composite bundle::text)
(dictionary.composite bundle::io)
+ (dictionary.composite (extension anchor,expression,declaration))
)))
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux
index 942f931d8..1d4f70473 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/jvm.lux
@@ -455,18 +455,16 @@
(is [Register (Bytecode Any)] [offset (_#in [])]))
product.right))
-(def (constructor_method_generation archive super_class method)
- (-> Archive (Type Class) (jvm.Constructor Synthesis) (Operation (Resource Method)))
+(def (constructor_method_generation generate archive super_class method)
+ (-> (generation.Phase Anchor (Bytecode Any) Definition) Archive (Type Class) (jvm.Constructor Synthesis) (Operation (Resource Method)))
(<| (let [[privacy strict_floating_point? annotations method_tvars exceptions
self arguments constructor_argumentsS
bodyS] method
bodyS (when (list.size arguments)
0 (host.without_fake_parameter bodyS)
_ bodyS)])
- (do [! phase.monad]
- [generate declaration.generation])
declaration.lifted_generation
- (do !
+ (do [! phase.monad]
[constructor_argumentsG (monad.each ! (|>> product.right (generate archive))
constructor_argumentsS)
bodyG (generate archive bodyS)
@@ -481,17 +479,17 @@
(if strict_floating_point?
method.strict
modifier.empty))
- ..constructor_name
- true (type.method [method_tvars argumentsT type.void exceptions])
- (list)
- {.#Some (all _.composite
- (_.aload 0)
- (..composite constructor_argumentsG)
- (_.invokespecial super_class ..constructor_name super_constructorT)
- (method_arguments 1 argumentsT)
- bodyG
- _.return
- )})))))
+ ..constructor_name
+ true (type.method [method_tvars argumentsT type.void exceptions])
+ (list)
+ {.#Some (all _.composite
+ (_.aload 0)
+ (..composite constructor_argumentsG)
+ (_.invokespecial super_class ..constructor_name super_constructorT)
+ (method_arguments 1 argumentsT)
+ bodyG
+ _.return
+ )})))))
(def (method_return returnT)
(-> (Type Return) (Bytecode Any))
@@ -531,87 +529,81 @@
... (at type.equivalence = type.double returnT)
(unwrap_primitive _.dreturn type.double)))))))
-(def (overriden_method_generation archive method)
- (-> Archive (jvm.Overriden_Method Synthesis) (Operation (Resource Method)))
- (do [! phase.monad]
- [.let [[super method_name strict_floating_point? annotations
- method_tvars self arguments returnJ exceptionsJ
- bodyS] method
- bodyS (when (list.size arguments)
- 0 (host.without_fake_parameter bodyS)
- _ bodyS)]
- generate declaration.generation]
- (declaration.lifted_generation
- (do !
- [bodyG (generate archive bodyS)
- .let [argumentsT (list#each product.right arguments)]]
- (in (method.method (all modifier#composite
- method.public
- (if strict_floating_point?
- method.strict
- modifier.empty))
- method_name
- true (type.method [method_tvars argumentsT returnJ exceptionsJ])
- (list)
- {.#Some (all _.composite
- (method_arguments 1 argumentsT)
- bodyG
- (method_return returnJ))}))))))
-
-(def (virtual_method_generation archive method)
- (-> Archive (jvm.Virtual_Method Synthesis) (Operation (Resource Method)))
- (do [! phase.monad]
- [.let [[method_name privacy final? strict_floating_point? annotations method_tvars
- self arguments returnJ exceptionsJ
- bodyS] method
- bodyS (when (list.size arguments)
- 0 (host.without_fake_parameter bodyS)
- _ bodyS)]
- generate declaration.generation]
- (declaration.lifted_generation
- (do !
- [bodyG (generate archive bodyS)
- .let [argumentsT (list#each product.right arguments)]]
- (in (method.method (all modifier#composite
- (..method_privacy privacy)
- (if strict_floating_point?
- method.strict
- modifier.empty)
- (if final?
- method.final
- modifier.empty))
- method_name
- true (type.method [method_tvars argumentsT returnJ exceptionsJ])
- (list)
- {.#Some (all _.composite
- (method_arguments 1 argumentsT)
- bodyG
- (method_return returnJ))}))))))
-
-(def (static_method_generation archive method)
- (-> Archive (jvm.Static_Method Synthesis) (Operation (Resource Method)))
- (do [! phase.monad]
- [.let [[method_name privacy strict_floating_point? annotations method_tvars
- arguments returnJ exceptionsJ
- bodyS] method]
- generate declaration.generation]
- (declaration.lifted_generation
- (do !
- [bodyG (generate archive bodyS)
- .let [argumentsT (list#each product.right arguments)]]
- (in (method.method (all modifier#composite
- (..method_privacy privacy)
- method.static
- (if strict_floating_point?
- method.strict
- modifier.empty))
- method_name
- true (type.method [method_tvars argumentsT returnJ exceptionsJ])
- (list)
- {.#Some (all _.composite
- (method_arguments 0 argumentsT)
- bodyG
- (method_return returnJ))}))))))
+(def (overriden_method_generation generate archive method)
+ (-> (generation.Phase Anchor (Bytecode Any) Definition) Archive (jvm.Overriden_Method Synthesis) (Operation (Resource Method)))
+ (<| (let [[super method_name strict_floating_point? annotations
+ method_tvars self arguments returnJ exceptionsJ
+ bodyS] method
+ bodyS (when (list.size arguments)
+ 0 (host.without_fake_parameter bodyS)
+ _ bodyS)])
+ declaration.lifted_generation
+ (do [! phase.monad]
+ [bodyG (generate archive bodyS)
+ .let [argumentsT (list#each product.right arguments)]]
+ (in (method.method (all modifier#composite
+ method.public
+ (if strict_floating_point?
+ method.strict
+ modifier.empty))
+ method_name
+ true (type.method [method_tvars argumentsT returnJ exceptionsJ])
+ (list)
+ {.#Some (all _.composite
+ (method_arguments 1 argumentsT)
+ bodyG
+ (method_return returnJ))})))))
+
+(def (virtual_method_generation generate archive method)
+ (-> (generation.Phase Anchor (Bytecode Any) Definition) Archive (jvm.Virtual_Method Synthesis) (Operation (Resource Method)))
+ (<| (let [[method_name privacy final? strict_floating_point? annotations method_tvars
+ self arguments returnJ exceptionsJ
+ bodyS] method
+ bodyS (when (list.size arguments)
+ 0 (host.without_fake_parameter bodyS)
+ _ bodyS)])
+ declaration.lifted_generation
+ (do [! phase.monad]
+ [bodyG (generate archive bodyS)
+ .let [argumentsT (list#each product.right arguments)]]
+ (in (method.method (all modifier#composite
+ (..method_privacy privacy)
+ (if strict_floating_point?
+ method.strict
+ modifier.empty)
+ (if final?
+ method.final
+ modifier.empty))
+ method_name
+ true (type.method [method_tvars argumentsT returnJ exceptionsJ])
+ (list)
+ {.#Some (all _.composite
+ (method_arguments 1 argumentsT)
+ bodyG
+ (method_return returnJ))})))))
+
+(def (static_method_generation generate archive method)
+ (-> (generation.Phase Anchor (Bytecode Any) Definition) Archive (jvm.Static_Method Synthesis) (Operation (Resource Method)))
+ (<| (let [[method_name privacy strict_floating_point? annotations method_tvars
+ arguments returnJ exceptionsJ
+ bodyS] method])
+ declaration.lifted_generation
+ (do [! phase.monad]
+ [bodyG (generate archive bodyS)
+ .let [argumentsT (list#each product.right arguments)]]
+ (in (method.method (all modifier#composite
+ (..method_privacy privacy)
+ method.static
+ (if strict_floating_point?
+ method.strict
+ modifier.empty))
+ method_name
+ true (type.method [method_tvars argumentsT returnJ exceptionsJ])
+ (list)
+ {.#Some (all _.composite
+ (method_arguments 0 argumentsT)
+ bodyG
+ (method_return returnJ))})))))
(def (abstract_method_generation method)
(-> (jvm.Abstract_Method Synthesis) (Resource Method))
@@ -620,25 +612,25 @@
(method.method (all modifier#composite
(..method_privacy privacy)
method.abstract)
- name
- true (type.method [variables (list#each product.right arguments) return exceptions])
- (list)
- {.#None})))
+ name
+ true (type.method [variables (list#each product.right arguments) return exceptions])
+ (list)
+ {.#None})))
-(def (method_generation archive super_class method)
- (-> Archive (Type Class) (Method_Definition Synthesis) (Operation (Resource Method)))
+(def (method_generation generate archive super_class method)
+ (-> (generation.Phase Anchor (Bytecode Any) Definition) Archive (Type Class) (Method_Definition Synthesis) (Operation (Resource Method)))
(when method
{#Constructor method}
- (..constructor_method_generation archive super_class method)
+ (..constructor_method_generation generate archive super_class method)
{#Overriden_Method method}
- (..overriden_method_generation archive method)
+ (..overriden_method_generation generate archive method)
{#Virtual_Method method}
- (..virtual_method_generation archive method)
+ (..virtual_method_generation generate archive method)
{#Static_Method method}
- (..static_method_generation archive method)
+ (..static_method_generation generate archive method)
{#Abstract_Method method}
(at phase.monad in (..abstract_method_generation method))))
@@ -680,7 +672,7 @@
list
(<synthesis>.result ..method_synthesis)
phase.lifted)
- methodG (method_generation archive super methodS')]
+ methodG (method_generation generate archive super methodS')]
(in [dependencies methodG]))))
(def class_name
@@ -763,18 +755,18 @@
(if strict_floating_point?
method.strict
modifier.empty))
- ..constructor_name
- true (type.method [variables (list#each product.right arguments) type.void exceptions])
- (list)
- {.#Some (all _.composite
- (_.aload 0)
- (|> constructor_arguments
- (list#each (|>> product.left ..mock_value))
- (monad.all _.monad))
- (|> (type.method [(list) (list#each product.left constructor_arguments) type.void (list)])
- (_.invokespecial super ..constructor_name))
- _.return
- )})
+ ..constructor_name
+ true (type.method [variables (list#each product.right arguments) type.void exceptions])
+ (list)
+ {.#Some (all _.composite
+ (_.aload 0)
+ (|> constructor_arguments
+ (list#each (|>> product.left ..mock_value))
+ (monad.all _.monad))
+ (|> (type.method [(list) (list#each product.left constructor_arguments) type.void (list)])
+ (_.invokespecial super ..constructor_name))
+ _.return
+ )})
{#Overriden_Method [super name strict_floating_point? annotations variables
self arguments return exceptions
@@ -784,10 +776,10 @@
(if strict_floating_point?
method.strict
modifier.empty))
- name
- true (type.method [variables (list#each product.right arguments) return exceptions])
- (list)
- {.#Some (..mock_return return)})
+ name
+ true (type.method [variables (list#each product.right arguments) return exceptions])
+ (list)
+ {.#Some (..mock_return return)})
{#Virtual_Method [name privacy final? strict_floating_point? annotations variables
self arguments return exceptions
@@ -800,10 +792,10 @@
(if final?
method.final
modifier.empty))
- name
- true (type.method [variables (list#each product.right arguments) return exceptions])
- (list)
- {.#Some (..mock_return return)})
+ name
+ true (type.method [variables (list#each product.right arguments) return exceptions])
+ (list)
+ {.#Some (..mock_return return)})
{#Static_Method [name privacy strict_floating_point? annotations
variables arguments return exceptions
@@ -814,20 +806,20 @@
(if strict_floating_point?
method.strict
modifier.empty))
- name
- true (type.method [variables (list#each product.right arguments) return exceptions])
- (list)
- {.#Some (..mock_return return)})
+ name
+ true (type.method [variables (list#each product.right arguments) return exceptions])
+ (list)
+ {.#Some (..mock_return return)})
{#Abstract_Method [name privacy annotations
variables arguments return exceptions]}
(method.method (all modifier#composite
method.abstract
(..method_privacy privacy))
- name
- true (type.method [variables (list#each product.right arguments) return exceptions])
- (list)
- {.#None})
+ name
+ true (type.method [variables (list#each product.right arguments) return exceptions])
+ (list)
+ {.#None})
))
(def (mock declaration super interfaces inheritance fields methods)
@@ -907,7 +899,8 @@
methods (monad.each ! (..method_definition archive super interfaces [mapping selfT]
[(the [declaration.#analysis declaration.#phase] state)
(the [declaration.#synthesis declaration.#phase] state)
- (the [declaration.#generation declaration.#phase] state)])
+ ((the [declaration.#generation declaration.#phase] state)
+ (the [declaration.#analysis declaration.#state extension.#state] state))])
methods)
.let [all_dependencies (cache.all (list#each product.left methods))]
bytecode (<| (at ! each (\\format.result class.format))
@@ -932,10 +925,10 @@
(method.method (all modifier#composite
method.public
method.abstract)
- /#name
- true type
- (list)
- {.#None})))
+ /#name
+ true type
+ (list)
+ {.#None})))
(def jvm::class::interface
(Handler Anchor (Bytecode Any) Definition)
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux
index 2ea6deb7d..b88520b8d 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/extension/declaration/lux.lux
@@ -102,7 +102,8 @@
[state (///.lifted phase.state)
.let [analyse (the [/////declaration.#analysis /////declaration.#phase] state)
synthesize (the [/////declaration.#synthesis /////declaration.#phase] state)
- generate (the [/////declaration.#generation /////declaration.#phase] state)]
+ generate ((the [/////declaration.#generation /////declaration.#phase] state)
+ (the [/////declaration.#analysis /////declaration.#state ///.#state] state))]
[_ codeA] (<| /////declaration.lifted_analysis
scope.with
typeA.fresh
@@ -148,7 +149,8 @@
[state (///.lifted phase.state)
.let [analyse (the [/////declaration.#analysis /////declaration.#phase] state)
synthesize (the [/////declaration.#synthesis /////declaration.#phase] state)
- generate (the [/////declaration.#generation /////declaration.#phase] state)]
+ generate ((the [/////declaration.#generation /////declaration.#phase] state)
+ (the [/////declaration.#analysis /////declaration.#state ///.#state] state))]
[_ code//type codeA] (/////declaration.lifted_analysis
(scope.with
(typeA.fresh
@@ -201,7 +203,8 @@
[state (///.lifted phase.state)
.let [analyse (the [/////declaration.#analysis /////declaration.#phase] state)
synthesize (the [/////declaration.#synthesis /////declaration.#phase] state)
- generate (the [/////declaration.#generation /////declaration.#phase] state)]
+ generate ((the [/////declaration.#generation /////declaration.#phase] state)
+ (the [/////declaration.#analysis /////declaration.#state ///.#state] state))]
[_ codeA] (<| /////declaration.lifted_analysis
scope.with
typeA.fresh
@@ -218,22 +221,23 @@
)
... TODO: Get rid of this function ASAP.
-(def (refresh expander host_analysis)
+(def (refresh expander anchor,expression,declaration host_analysis)
(All (_ anchor expression declaration)
- (-> Expander /////analysis.Bundle (Operation anchor expression declaration Any)))
+ (-> Expander [Type Type Type] /////analysis.Bundle (Operation anchor expression declaration Any)))
(do phase.monad
[[bundle state] phase.state
.let [eval (/////analysis/evaluation.evaluator expander
(the [/////declaration.#synthesis /////declaration.#state] state)
(the [/////declaration.#generation /////declaration.#state] state)
- (the [/////declaration.#generation /////declaration.#phase] state))
+ ((the [/////declaration.#generation /////declaration.#phase] state)
+ (the [/////declaration.#analysis /////declaration.#state ///.#state] state)))
previous_analysis_extensions (the [/////declaration.#analysis /////declaration.#state ///.#bundle] state)]]
(phase.with [bundle
(revised [/////declaration.#analysis /////declaration.#state]
(is (-> /////analysis.State+ /////analysis.State+)
(|>> product.right
[(|> previous_analysis_extensions
- (dictionary.composite (///analysis.bundle eval host_analysis)))]))
+ (dictionary.composite (///analysis.bundle eval anchor,expression,declaration host_analysis)))]))
state)])))
(def (announce_definition! short type)
@@ -242,8 +246,8 @@
(/////declaration.lifted_generation
(/////generation.log! (format short " : " (%.type type)))))
-(def (lux::def expander host_analysis)
- (-> Expander /////analysis.Bundle Handler)
+(def (lux::def expander anchor,expression,declaration host_analysis)
+ (-> Expander [Type Type Type] /////analysis.Bundle Handler)
(function (_ extension_name phase archive inputsC+)
(when inputsC+
(list [_ {.#Symbol ["" short_name]}] valueC exported?C)
@@ -255,7 +259,7 @@
[_ _ exported?] (evaluate! archive Bit exported?C)
_ (/////declaration.lifted_analysis
(moduleA.define short_name {.#Definition [(as Bit exported?) type value]}))
- _ (..refresh expander host_analysis)
+ _ (..refresh expander anchor,expression,declaration host_analysis)
_ (..announce_definition! short_name type)]
(in /////declaration.no_requirements))
@@ -268,7 +272,7 @@
<>.some
<code>.tuple))
-(def defmodule
+(def def_module
Handler
(..custom
[..imports
@@ -304,7 +308,7 @@
{.#Definition _}
(moduleA.define alias {.#Alias original}))))
-(def defalias
+(def def_alias
Handler
(..custom
[(all <>.and <code>.local <code>.symbol)
@@ -421,7 +425,7 @@
..declaration]
)
-(def (bundle::def expander host_analysis program anchorT,expressionT,declarationT extender)
+(def (bundle::def expander host_analysis program anchor,expression,declaration extender)
(All (_ anchor expression declaration)
(-> Expander
/////analysis.Bundle
@@ -431,15 +435,15 @@
(Bundle anchor expression declaration)))
(<| (///bundle.prefix "def")
(|> ///bundle.empty
- (dictionary.has "module" defmodule)
- (dictionary.has "alias" defalias)
- (dictionary.has "analysis" (def_analysis anchorT,expressionT,declarationT extender))
- (dictionary.has "synthesis" (def_synthesis anchorT,expressionT,declarationT extender))
- (dictionary.has "generation" (def_generation anchorT,expressionT,declarationT extender))
- (dictionary.has "declaration" (def_declaration anchorT,expressionT,declarationT extender))
+ (dictionary.has "module" def_module)
+ (dictionary.has "alias" def_alias)
+ (dictionary.has "analysis" (def_analysis anchor,expression,declaration extender))
+ (dictionary.has "synthesis" (def_synthesis anchor,expression,declaration extender))
+ (dictionary.has "generation" (def_generation anchor,expression,declaration extender))
+ (dictionary.has "declaration" (def_declaration anchor,expression,declaration extender))
)))
-(def .public (bundle expander host_analysis program anchorT,expressionT,declarationT extender)
+(def .public (bundle expander host_analysis program anchor,expression,declaration extender)
(All (_ anchor expression declaration)
(-> Expander
/////analysis.Bundle
@@ -449,5 +453,5 @@
(Bundle anchor expression declaration)))
(<| (///bundle.prefix "lux")
(|> ///bundle.empty
- (dictionary.has "def" (lux::def expander host_analysis))
- (dictionary.composite (..bundle::def expander host_analysis program anchorT,expressionT,declarationT extender)))))
+ (dictionary.has "def" (lux::def expander anchor,expression,declaration host_analysis))
+ (dictionary.composite (..bundle::def expander host_analysis program anchor,expression,declaration extender)))))
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux
index 0b9ec3dba..77274bc83 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/generation/jvm.lux
@@ -3,11 +3,28 @@
[lux (.except)
[abstract
[monad (.only do)]]
- [meta
+ [control
+ ["[0]" try]
+ ["[0]" exception (.only Exception)]]
+ [data
+ [text
+ ["%" \\format]]]
+ ["[0]" meta (.only)
[macro
- ["^" pattern]]]]]
+ ["^" pattern]]
+ [target
+ [jvm
+ [bytecode (.only Bytecode)]]]
+ [type
+ ["[0]" check]]
+ [compiler
+ [meta
+ ["[0]" archive (.only Archive)]
+ ["[0]" cache
+ [dependency
+ ["[1]/[0]" artifact]]]]]]]]
["[0]" /
- [runtime (.only Phase)]
+ [runtime (.only Operation Phase Extender)]
["[1][0]" primitive]
["[1][0]" structure]
["[1][0]" reference]
@@ -17,13 +34,38 @@
["//[1]" ///
["[1][0]" extension]
[//
- ["[0]" synthesis]
+ ["[0]" synthesis (.only Synthesis)]
[///
["[0]" reference]
["[1]" phase (.use "[1]#[0]" monad)]]]]])
-(def .public (generate archive synthesis)
- Phase
+(exception.def .public (not_an_extension [name expected actual])
+ (Exception [Symbol Type Type])
+ (exception.report
+ (list ["Name" (%.symbol name)]
+ ["Expected" (%.type expected)]
+ ["Actual" (%.type actual)])))
+
+(def (extension_application extender lux
+ phase archive
+ name parameters)
+ (-> Extender Lux
+ (-> Extender Lux Phase) Archive
+ Symbol (List Synthesis)
+ (Operation (Bytecode Any)))
+ (when (|> name
+ meta.export
+ (meta.result lux))
+ {try.#Success [exported? type value]}
+ (if (check.subsumes? .Generation type)
+ ((extender value) "" (phase extender lux) archive parameters)
+ (///.except ..not_an_extension [name .Generation type]))
+
+ {try.#Failure error}
+ (///.failure error)))
+
+(def .public (generate extender lux archive synthesis)
+ (-> Extender Lux Phase)
(when synthesis
(^.with_template [<tag> <generator>]
[(<tag> value)
@@ -34,10 +76,10 @@
[synthesis.text /primitive.text])
(synthesis.variant variantS)
- (/structure.variant generate archive variantS)
+ (/structure.variant (generate extender lux) archive variantS)
(synthesis.tuple members)
- (/structure.tuple generate archive members)
+ (/structure.tuple (generate extender lux) archive members)
{synthesis.#Reference reference}
(when reference
@@ -48,32 +90,35 @@
(/reference.constant archive constant))
(synthesis.branch/when [valueS pathS])
- (/when.when generate archive [valueS pathS])
+ (/when.when (generate extender lux) archive [valueS pathS])
(synthesis.branch/exec [this that])
- (/when.exec generate archive [this that])
+ (/when.exec (generate extender lux) archive [this that])
(synthesis.branch/let [inputS register bodyS])
- (/when.let generate archive [inputS register bodyS])
+ (/when.let (generate extender lux) archive [inputS register bodyS])
(synthesis.branch/if [conditionS thenS elseS])
- (/when.if generate archive [conditionS thenS elseS])
+ (/when.if (generate extender lux) archive [conditionS thenS elseS])
(synthesis.branch/get [path recordS])
- (/when.get generate archive [path recordS])
+ (/when.get (generate extender lux) archive [path recordS])
(synthesis.loop/scope scope)
- (/loop.scope generate archive scope)
+ (/loop.scope (generate extender lux) archive scope)
(synthesis.loop/again updates)
- (/loop.again generate archive updates)
+ (/loop.again (generate extender lux) archive updates)
(synthesis.function/abstraction abstraction)
- (/function.abstraction generate archive abstraction)
+ (/function.abstraction (generate extender lux) archive abstraction)
(synthesis.function/apply application)
- (/function.apply generate archive application)
+ (/function.apply (generate extender lux) archive application)
+
+ {synthesis.#Extension [["" name] parameters]}
+ (///extension.apply archive (generate extender lux) [name parameters])
- {synthesis.#Extension extension}
- (///extension.apply archive generate extension)
+ {synthesis.#Extension [name parameters]}
+ (extension_application extender lux generate archive name parameters)
))
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux
index fba249351..24c8189a3 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis.lux
@@ -93,14 +93,14 @@
(|> (//extension.apply archive optimization [name args])
(phase.result' state)
(pipe.when
- {try.#Success output}
- {try.#Success output}
-
{try.#Failure _}
(|> args
(monad.each phase.monad optimization')
- (phase#each (|>> [name] {/.#Extension}))
- (phase.result' state))))))
+ (phase#each (|>> [["" name]] {/.#Extension}))
+ (phase.result' state))
+
+ success
+ success))))
)))
(def .public (phase archive analysis)
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux
index 0ae8912f8..99eddb022 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/phase/synthesis/loop.lux
@@ -187,7 +187,7 @@
<application>)))
... TODO: Stop relying on this custom code.
- {/.#Extension ["lux syntax char case!" (list.partial input else matches)]}
+ {/.#Extension [["" "lux syntax char case!"] (list.partial input else matches)]}
(if return?
(do [! maybe.monad]
[input (again false input)
@@ -204,7 +204,7 @@
(again false match)))
matches)
else (again return? else)]
- (in {/.#Extension ["lux syntax char case!" (list.partial input else matches)]}))
+ (in {/.#Extension [["" "lux syntax char case!"] (list.partial input else matches)]}))
{.#None})
{/.#Extension [name args]}
diff --git a/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux b/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux
index 377e232b1..090832274 100644
--- a/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux
+++ b/stdlib/source/library/lux/meta/compiler/language/lux/synthesis.lux
@@ -23,6 +23,7 @@
["i" int]
["f" frac]]]
[meta
+ ["[0]" symbol]
[macro
["^" pattern]]]]]
["[0]" /
@@ -129,7 +130,7 @@
{#Structure (Complex Synthesis)}
{#Reference Reference}
{#Control (Control Synthesis)}
- {#Extension (Extension Synthesis)})))
+ {#Extension [Symbol (List Synthesis)]})))
(with_template [<special> <general>]
[(type .public <special>
@@ -413,7 +414,7 @@
(text.interposed " ")
(text.enclosed ["{#again " "}"]))))
- {#Extension [name args]}
+ {#Extension [[_ name] args]}
(|> (list#each %synthesis args)
(text.interposed " ")
(format (%.text name) " ")
@@ -695,7 +696,9 @@
[#Structure (analysis/complex.equivalence =)]
[#Reference reference.equivalence]
[#Control (control_equivalence =)]
- [#Extension (extension.equivalence =)])
+ [#Extension (product.equivalence symbol.equivalence (list.equivalence =))
+ ... (extension.equivalence =)
+ ])
_
false))))
@@ -712,14 +715,16 @@
(def (hash value)
(let [again_hash [..equivalence hash]]
(when value
- (^.with_template [<tag> <hash>]
+ (^.with_template [<factor> <tag> <hash>]
[{<tag> value}
- (at <hash> hash value)])
- ([#Simple /simple.hash]
- [#Structure (analysis/complex.hash again_hash)]
- [#Reference reference.hash]
- [#Control (..control_hash again_hash)]
- [#Extension (extension.hash again_hash)]))))))
+ (n.* <factor> (at <hash> hash value))])
+ ([2 #Simple /simple.hash]
+ [3 #Structure (analysis/complex.hash again_hash)]
+ [5 #Reference reference.hash]
+ [7 #Control (..control_hash again_hash)]
+ [11 #Extension (product.hash symbol.hash (list.hash again_hash))
+ ... (extension.hash again_hash)
+ ]))))))
(def .public !bind_top
(template (!bind_top register thenP)
diff --git a/stdlib/source/library/lux/meta/extension.lux b/stdlib/source/library/lux/meta/extension.lux
index 175b1143f..b8c707ddf 100644
--- a/stdlib/source/library/lux/meta/extension.lux
+++ b/stdlib/source/library/lux/meta/extension.lux
@@ -65,6 +65,37 @@
[<c>.any <c>.end <c>.and <c>.result "lux def analysis" analysis]
[<a>.any <a>.end <a>.and <a>.result "lux def synthesis" synthesis]
- [<s>.any <s>.end <s>.and <s>.result "lux def generation" generation]
+ ... [<s>.any <s>.end <s>.and <s>.result "lux def generation" generation]
[<c>.any <c>.end <c>.and <c>.result "lux def declaration" declaration]
)
+
+(with_template [<any> <end> <and> <result> <extension> <name> <type>]
+ [(def .public <name>
+ (syntax (_ [[handler extension phase archive inputs] (<c>.form (all <>.and
+ <c>.local
+ <c>.local
+ <c>.local
+ <c>.local
+ (<c>.tuple (<>.some <c>.any))))
+ body <c>.any])
+ (let [g!handler (code.local handler)
+ g!name (code.local extension)
+ g!phase (code.local phase)
+ g!archive (code.local archive)]
+ (with_symbols [g!inputs g!error g!_]
+ (in (list (` (<extension> (.function ((, g!handler) (, g!name) (, g!phase) (, g!archive) (, g!inputs))
+ (.when (<result>
+ (monad.do <>.monad
+ [(,* inputs)
+ (, g!_) <end>]
+ (.at <>.monad (,' in) (, body)))
+ (, g!inputs))
+ {.#Right (, g!_)}
+ (, g!_)
+
+ {.#Left (, g!error)}
+ (phase.failure (, g!error)))
+ )))))))))]
+
+ [<s>.any <s>.end <s>.and <s>.result "lux extension generation" generation .Generation]
+ )
diff --git a/stdlib/source/library/lux/meta/type/check.lux b/stdlib/source/library/lux/meta/type/check.lux
index 718f27931..b36b2b112 100644
--- a/stdlib/source/library/lux/meta/type/check.lux
+++ b/stdlib/source/library/lux/meta/type/check.lux
@@ -784,7 +784,9 @@
(monad.each ..monad (clean aliases))
(check#each (|>> {.#Primitive name})))
- (^.or {.#Parameter _} {.#Ex _} {.#Named _})
+ (^.or {.#Parameter _}
+ {.#Ex _}
+ {.#Named _})
(check#in inputT)
(^.with_template [<tag>]
@@ -793,7 +795,10 @@
[leftT' (clean aliases leftT)]
(|> (clean aliases rightT)
(check#each (|>> {<tag> leftT'}))))])
- ([.#Sum] [.#Product] [.#Function] [.#Apply])
+ ([.#Sum]
+ [.#Product]
+ [.#Function]
+ [.#Apply])
{.#Var @it}
(when aliases
@@ -828,5 +833,6 @@
[envT+' (monad.each ! (clean aliases) envT+)
unquantifiedT' (clean aliases unquantifiedT)]
(in {<tag> envT+' unquantifiedT'}))])
- ([.#UnivQ] [.#ExQ])
+ ([.#UnivQ]
+ [.#ExQ])
))
diff --git a/stdlib/source/library/lux/meta/type/unit.lux b/stdlib/source/library/lux/meta/type/unit.lux
index e95b261f0..823e300cd 100644
--- a/stdlib/source/library/lux/meta/type/unit.lux
+++ b/stdlib/source/library/lux/meta/type/unit.lux
@@ -1,3 +1,4 @@
+... https://en.wikipedia.org/wiki/Dimensional_analysis
(.require
[library
[lux (.except type)
diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux
index 99d36a8f9..4b12d65a9 100644
--- a/stdlib/source/program/compositor.lux
+++ b/stdlib/source/program/compositor.lux
@@ -143,10 +143,10 @@
analysis.Bundle
(IO (Platform <parameters>))
(generation.Bundle <parameters>)
- (-> phase.Wrapper (declaration.Bundle <parameters>))
+ (declaration.Bundle <parameters>)
(Program expression artifact) (-> Archive Symbol (generation.Operation <parameters> expression))
[Type Type Type]
- (-> phase.Wrapper Extender)
+ Extender
Service
[Packager file.Path]
(Async Any)))
diff --git a/stdlib/source/test/lux/meta/extension.lux b/stdlib/source/test/lux/meta/extension.lux
index 66bf59e0e..419570970 100644
--- a/stdlib/source/test/lux/meta/extension.lux
+++ b/stdlib/source/test/lux/meta/extension.lux
@@ -20,7 +20,7 @@
["[0]" random]
[number
["n" nat]]]
- [meta
+ ["[0]" meta (.only)
["[0]" code
["<[1]>" \\parser]]
[macro
@@ -54,6 +54,7 @@
["[0]" synthesis (.only)
["<[1]>" \\parser]]
[phase
+ ["[0]" extension]
[generation
(.,, (.for "JVM" (.,, (.these ["[0]" jvm
["[1]/[0]" runtime]]))
@@ -103,6 +104,11 @@
(phase archive pass_through))
... Generation
+ (def my_generation|generation
+ Generation
+ (generation (_ self phase archive [pass_through <synthesis>.any])
+ (phase archive pass_through)))
+
(analysis (..my_generation self phase archive [parameters (<>.some <code>.any)])
(let [! phase.monad]
(|> parameters
@@ -113,26 +119,26 @@
(let [! phase.monad]
(|> parameters
(monad.each ! (phase archive))
- (at ! each (|>> {synthesis.#Extension self})))))
-
- (generation (..my_generation self phase archive [pass_through <synthesis>.any])
- (phase archive pass_through))
+ (at ! each (|>> {synthesis.#Extension (symbol ..my_generation|generation)})))))
+
+ (def dummy_generation|generation
+ Generation
+ (generation (_ self phase archive [])
+ (let [self ..dummy_generation]
+ (at phase.monad in
+ (for @.jvm (jvm.string self)
+ @.js (js.string self)
+ @.python (python.unicode self)
+ @.lua (lua.string self)
+ @.ruby (ruby.string self)
+ @.php (php.string self)
+ @.scheme (scheme.string self))))))
(analysis (..dummy_generation self phase archive [])
(at phase.monad in {analysis.#Extension self (list)}))
(synthesis (..dummy_generation self phase archive [])
- (at phase.monad in {synthesis.#Extension self (list)}))
-
- (generation (..dummy_generation self phase archive [])
- (at phase.monad in
- (for @.jvm (jvm.string self)
- @.js (js.string self)
- @.python (python.unicode self)
- @.lua (lua.string self)
- @.ruby (ruby.string self)
- @.php (php.string self)
- @.scheme (scheme.string self))))
+ (at phase.monad in {synthesis.#Extension (symbol ..dummy_generation|generation) (list)}))
... Declaration
(declaration (..my_declaration self phase archive [expression <code>.any])
@@ -146,9 +152,12 @@
expressionS (declaration.lifted_synthesis
(synthesis_phase archive expressionA))
+ lux (<| declaration.lifted_analysis
+ extension.lifted
+ meta.compiler_state)
generation_phase declaration.generation
expressionG (declaration.lifted_generation
- (generation_phase archive expressionS))
+ (generation_phase lux archive expressionS))
_ (declaration.lifted_generation
(generation.with_new_context archive unit.none