diff options
author | Eduardo Julian | 2022-01-07 20:29:29 -0400 |
---|---|---|
committer | Eduardo Julian | 2022-01-07 20:29:29 -0400 |
commit | ef847d54cc6ac57bb2d470c1164ca7daeaa241b1 (patch) | |
tree | e031837ea0e6a76588378471dd7a4724d1035c53 | |
parent | 0983f62269154f4ba607e6809b8d8ae7ebd96d21 (diff) |
Now explicitly optimizing "exec".
13 files changed, 128 insertions, 24 deletions
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/generation/jvm/host.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/generation/jvm/host.lux index 6b26d8cfb..7c70c99ed 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/generation/jvm/host.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/generation/jvm/host.lux @@ -897,6 +897,9 @@ (^ (//////synthesis.branch/case [inputS pathS])) (//////synthesis.branch/case [(again inputS) (normalize_path again pathS)]) + (^ (//////synthesis.branch/exec [this that])) + (//////synthesis.branch/exec [(again this) (again that)]) + (^ (//////synthesis.branch/let [inputS register outputS])) (//////synthesis.branch/let [(again inputS) register (again outputS)]) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm.lux index 060a20f6d..83171eea1 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm.lux @@ -47,6 +47,9 @@ (^ (synthesis.branch/case [valueS pathS])) (/case.case generate archive [valueS pathS]) + (^ (synthesis.branch/exec [this that])) + (/case.exec generate archive [this that]) + (^ (synthesis.branch/let [inputS register bodyS])) (/case.let generate archive [inputS register bodyS]) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/case.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/case.lux index fd927cebd..c166c3aed 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/case.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/jvm/case.lux @@ -1,6 +1,6 @@ (.using [library - [lux {"-" Type Label if let case int} + [lux {"-" Type Label if let exec case int} [abstract ["[0]" monad {"+" do}]] [control @@ -276,6 +276,16 @@ (<| (_.when_acknowledged @end) (_.set_label @end))))))) +(def: .public (exec phase archive [this that]) + (Generator [Synthesis Synthesis]) + (do phase.monad + [this! (phase archive this) + that! (phase archive that)] + (in ($_ _.composite + this! + _.pop + that!)))) + (def: .public (let phase archive [inputS register bodyS]) (Generator [Synthesis Register Synthesis]) (do phase.monad diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/case.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/case.lux index 81551d45d..29d478d0b 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/case.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/case.lux @@ -17,7 +17,7 @@ [number ["n" nat] ["[0]" i64] - ["[0]" frac ("[1]#[0]" equivalence)]]]]] + ["[0]" frac]]]]] ["[0]" /// "_" [// ["/" synthesis {"+" Path Synthesis Operation Phase}] diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/function.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/function.lux index 1f1c21778..e2380b282 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/function.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/function.lux @@ -173,6 +173,12 @@ (case control {/.#Branch branch} (case branch + {/.#Exec [this that]} + (do phase.monad + [this (grow environment this) + that (grow environment that)] + (in (/.branch/exec [this that]))) + {/.#Let [inputS register bodyS]} (do phase.monad [inputS' (grow environment inputS) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/loop.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/loop.lux index 8c1ed71bb..8b9273084 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/loop.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/loop.lux @@ -120,6 +120,12 @@ path' (path_optimization (again return?) offset path)] (in (|> path' [input'] /.branch/case))) + (^ (/.branch/exec [this that])) + (do maybe.monad + [this (again false this) + that (again return? that)] + (in (/.branch/exec [this that]))) + (^ (/.branch/let [input register body])) (do maybe.monad [input' (again false input) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/variable.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/variable.lux index 92f36b56b..375919eca 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/variable.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/synthesis/variable.lux @@ -130,6 +130,10 @@ {/.#Control (case control {/.#Branch branch} {/.#Branch (case branch + {/.#Exec this that} + {/.#Exec (again this) + (again that)} + {/.#Let input register output} {/.#Let (again input) (..prune redundant register) @@ -362,6 +366,13 @@ (case control {/.#Branch branch} (case branch + {/.#Exec this that} + (do try.monad + [[redundancy this] (optimization' [redundancy this]) + [redundancy that] (optimization' [redundancy that])] + (in [redundancy + (/.branch/exec [this that])])) + {/.#Let input register output} (do try.monad [[redundancy input] (optimization' [redundancy input]) @@ -372,9 +383,7 @@ (maybe.else ..necessary!))]] (in [(dictionary.lacks register redundancy) {/.#Control (if redundant? - {/.#Branch {/.#Case input - {/.#Seq {/.#Pop} - {/.#Then (..remove_local register output)}}}} + {/.#Branch {/.#Exec input (..remove_local register output)}} {/.#Branch {/.#Let input register output}})}])) {/.#If test then else} diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/synthesis.lux b/stdlib/source/library/lux/tool/compiler/language/lux/synthesis.lux index 002eddaec..c27fa9a81 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/synthesis.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/synthesis.lux @@ -99,6 +99,7 @@ (type: .public (Branch s) (Variant + {#Exec s s} {#Let s Register s} {#If s s s} {#Get (List Member) s} @@ -261,6 +262,7 @@ content)])] [branch/case ..#Branch ..#Case] + [branch/exec ..#Branch ..#Exec] [branch/let ..#Branch ..#Let] [branch/if ..#Branch ..#If] [branch/get ..#Branch ..#Get] @@ -383,6 +385,10 @@ {#Branch branch} (case branch + {#Exec this that} + (|> (format (%synthesis this) " " (%synthesis that)) + (text.enclosed ["{#exec " "}"])) + {#Let input register body} (|> (format (%.nat register) " " (%synthesis input) " " (%synthesis body)) (text.enclosed ["{#let " "}"])) @@ -626,25 +632,30 @@ (def: (hash value) (case value - {#Let [input register body]} + {#Exec this that} ($_ n.* 2 + (# super hash this) + (# super hash that)) + + {#Let [input register body]} + ($_ n.* 3 (# super hash input) (# n.hash hash register) (# super hash body)) {#If [test then else]} - ($_ n.* 3 + ($_ n.* 5 (# super hash test) (# super hash then) (# super hash else)) {#Get [path record]} - ($_ n.* 5 + ($_ n.* 7 (# (list.hash ..member_hash) hash path) (# super hash record)) {#Case [input path]} - ($_ n.* 7 + ($_ n.* 11 (# super hash input) (# (..path'_hash super) hash path)) ))) diff --git a/stdlib/source/library/lux/tool/compiler/meta/archive/dependency.lux b/stdlib/source/library/lux/tool/compiler/meta/archive/dependency.lux index 5961a373f..f3e1c6d83 100644 --- a/stdlib/source/library/lux/tool/compiler/meta/archive/dependency.lux +++ b/stdlib/source/library/lux/tool/compiler/meta/archive/dependency.lux @@ -101,6 +101,11 @@ (case value {synthesis.#Branch value} (case value + {synthesis.#Exec this that} + ($_ list#composite + (references this) + (references that)) + {synthesis.#Let input _ body} ($_ list#composite (references input) diff --git a/stdlib/source/library/lux/tool/compiler/version.lux b/stdlib/source/library/lux/tool/compiler/version.lux index 3a923011d..c87b3a270 100644 --- a/stdlib/source/library/lux/tool/compiler/version.lux +++ b/stdlib/source/library/lux/tool/compiler/version.lux @@ -1,31 +1,28 @@ (.using - [library - [lux "*" - [data - [text - ["%" format]]] - [math - [number - ["n" nat]]]]]) + [library + [lux "*" + [data + [text + ["%" format]]] + [math + [number + ["n" nat]]]]]) (type: .public Version Nat) -(def: range 100) +(def: range + 100) (def: level (n.% ..range)) -(def: current - (-> Nat Nat) - (|>>)) - (def: next (n./ ..range)) (def: .public patch (-> Version Nat) - (|>> ..current ..level)) + (|>> ..level)) (def: .public minor (-> Version Nat) @@ -45,7 +42,7 @@ (def: .public (format version) (%.Format Version) - (%.format (..padded (..major version)) + (%.format (%.nat (..major version)) ..separator (..padded (..minor version)) ..separator diff --git a/stdlib/source/test/lux/data/collection/list.lux b/stdlib/source/test/lux/data/collection/list.lux index 06218dbb8..458b447e4 100644 --- a/stdlib/source/test/lux/data/collection/list.lux +++ b/stdlib/source/test/lux/data/collection/list.lux @@ -174,6 +174,17 @@ {.#None} false)) (/.enumeration sample))) + (do ! + [index (case size + 0 random.nat + _ (# ! each (n.% size) random.nat)) + .let [changed? (/#= sample (/.revised index ++ sample)) + same? (/#= sample (/.revised size ++ sample))]] + (_.cover [/.revised] + (case size + 0 (and changed? + same?) + _ (not changed?)))) )))) (def: slice diff --git a/stdlib/source/test/lux/tool.lux b/stdlib/source/test/lux/tool.lux index f7734328b..e2cbc50b6 100644 --- a/stdlib/source/test/lux/tool.lux +++ b/stdlib/source/test/lux/tool.lux @@ -5,6 +5,7 @@ ["[0]" / "_" [compiler ["[1][0]" arity] + ["[1][0]" version] ["[1][0]" reference] [language [lux @@ -21,6 +22,7 @@ Test ($_ _.and /arity.test + /version.test /reference.test /analysis/primitive.test ... /syntax.test diff --git a/stdlib/source/test/lux/tool/compiler/version.lux b/stdlib/source/test/lux/tool/compiler/version.lux new file mode 100644 index 000000000..01fc124a1 --- /dev/null +++ b/stdlib/source/test/lux/tool/compiler/version.lux @@ -0,0 +1,41 @@ +(.using + [library + [lux "*" + ["_" test {"+" Test}] + [abstract + [monad {"+" do}]] + [data + ["[0]" bit ("[1]#[0]" equivalence)] + ["[0]" text ("[1]#[0]" equivalence) + ["%" format {"+" format}]]] + [math + ["[0]" random {"+" Random}] + [number + ["n" nat]]]]] + [\\library + ["[0]" /]]) + +(def: .public random + (Random /.Version) + random.nat) + +(def: .public test + Test + (<| (_.covering /._) + (_.for [/.Version]) + (do [! random.monad] + [this ..random + that ..random] + (`` ($_ _.and + (_.cover [/.format] + (bit#= (n.= this that) + (text#= (/.format this) (/.format that)))) + (~~ (template [<level>] + [(_.cover [<level>] + (text.contains? (%.nat (<level> this)) + (/.format this)))] + + [/.patch] + [/.minor] + [/.major])) + ))))) |