From 75102dcfa7c2c0afd32cb5bf5ac012df2db6a7a1 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Tue, 5 Jan 2021 07:55:22 -0400 Subject: Added lexically-scoped templates. --- lux-js/project.clj | 5 +- lux-js/source/program.lux | 406 +++++++++--------- lux-lein/src/leiningen/lux/utils.clj | 6 +- stdlib/source/lux/control/concatenative.lux | 7 +- stdlib/source/lux/control/concurrency/actor.lux | 18 +- stdlib/source/lux/control/exception.lux | 16 +- stdlib/source/lux/control/security/capability.lux | 9 +- stdlib/source/lux/macro/poly.lux | 5 +- stdlib/source/lux/macro/syntax/annotations.lux | 41 ++ stdlib/source/lux/macro/syntax/check.lux | 41 ++ stdlib/source/lux/macro/syntax/common.lux | 7 - .../source/lux/macro/syntax/common/annotations.lux | 41 -- stdlib/source/lux/macro/syntax/common/check.lux | 41 -- .../source/lux/macro/syntax/common/declaration.lux | 46 --- .../source/lux/macro/syntax/common/definition.lux | 141 ------- stdlib/source/lux/macro/syntax/common/export.lux | 20 - stdlib/source/lux/macro/syntax/common/reader.lux | 20 - .../lux/macro/syntax/common/type/variable.lux | 27 -- stdlib/source/lux/macro/syntax/common/writer.lux | 17 - stdlib/source/lux/macro/syntax/declaration.lux | 46 +++ stdlib/source/lux/macro/syntax/definition.lux | 141 +++++++ stdlib/source/lux/macro/syntax/export.lux | 20 + stdlib/source/lux/macro/syntax/input.lux | 37 ++ stdlib/source/lux/macro/syntax/type/variable.lux | 27 ++ stdlib/source/lux/macro/template.lux | 127 +++++- stdlib/source/lux/math/random.lux | 6 +- stdlib/source/lux/time/date.lux | 8 +- stdlib/source/lux/time/instant.lux | 4 +- .../language/lux/phase/extension/analysis/js.lux | 50 +-- .../lux/phase/extension/generation/js/common.lux | 87 ++-- .../lux/phase/extension/generation/js/host.lux | 10 +- .../language/lux/phase/generation/js/case.lux | 129 +++--- .../language/lux/phase/generation/js/function.lux | 58 +-- .../language/lux/phase/generation/js/loop.lux | 19 +- .../language/lux/phase/generation/js/runtime.lux | 456 +++++++++++---------- .../lux/tool/compiler/meta/packager/script.lux | 34 +- stdlib/source/lux/type/abstract.lux | 7 +- stdlib/source/lux/type/unit.lux | 7 +- stdlib/source/poly/lux/abstract/equivalence.lux | 5 +- stdlib/source/poly/lux/abstract/functor.lux | 3 +- stdlib/source/program/compositor.lux | 2 - stdlib/source/spec/lux/abstract/enum.lux | 18 +- stdlib/source/test/aedifex/artifact.lux | 4 +- .../test/aedifex/artifact/time_stamp/time.lux | 31 ++ stdlib/source/test/lux/macro.lux | 4 +- stdlib/source/test/lux/macro/poly/json.lux | 4 +- .../source/test/lux/macro/syntax/annotations.lux | 53 +++ stdlib/source/test/lux/macro/syntax/check.lux | 48 +++ stdlib/source/test/lux/macro/syntax/common.lux | 71 ---- .../test/lux/macro/syntax/common/annotations.lux | 53 --- .../source/test/lux/macro/syntax/common/check.lux | 48 --- .../test/lux/macro/syntax/common/declaration.lux | 47 --- .../test/lux/macro/syntax/common/definition.lux | 97 ----- .../source/test/lux/macro/syntax/common/export.lux | 29 -- .../test/lux/macro/syntax/common/type/variable.lux | 37 -- .../source/test/lux/macro/syntax/declaration.lux | 47 +++ stdlib/source/test/lux/macro/syntax/definition.lux | 97 +++++ stdlib/source/test/lux/macro/syntax/export.lux | 29 ++ stdlib/source/test/lux/macro/syntax/input.lux | 46 +++ .../source/test/lux/macro/syntax/type/variable.lux | 37 ++ stdlib/source/test/lux/macro/template.lux | 38 ++ stdlib/source/test/lux/time/date.lux | 94 ++++- 62 files changed, 1674 insertions(+), 1455 deletions(-) create mode 100644 stdlib/source/lux/macro/syntax/annotations.lux create mode 100644 stdlib/source/lux/macro/syntax/check.lux delete mode 100644 stdlib/source/lux/macro/syntax/common.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/annotations.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/check.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/declaration.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/definition.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/export.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/reader.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/type/variable.lux delete mode 100644 stdlib/source/lux/macro/syntax/common/writer.lux create mode 100644 stdlib/source/lux/macro/syntax/declaration.lux create mode 100644 stdlib/source/lux/macro/syntax/definition.lux create mode 100644 stdlib/source/lux/macro/syntax/export.lux create mode 100644 stdlib/source/lux/macro/syntax/input.lux create mode 100644 stdlib/source/lux/macro/syntax/type/variable.lux create mode 100644 stdlib/source/test/aedifex/artifact/time_stamp/time.lux create mode 100644 stdlib/source/test/lux/macro/syntax/annotations.lux create mode 100644 stdlib/source/test/lux/macro/syntax/check.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common/annotations.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common/check.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common/declaration.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common/definition.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common/export.lux delete mode 100644 stdlib/source/test/lux/macro/syntax/common/type/variable.lux create mode 100644 stdlib/source/test/lux/macro/syntax/declaration.lux create mode 100644 stdlib/source/test/lux/macro/syntax/definition.lux create mode 100644 stdlib/source/test/lux/macro/syntax/export.lux create mode 100644 stdlib/source/test/lux/macro/syntax/input.lux create mode 100644 stdlib/source/test/lux/macro/syntax/type/variable.lux diff --git a/lux-js/project.clj b/lux-js/project.clj index 29b1800f8..28fcfff87 100644 --- a/lux-js/project.clj +++ b/lux-js/project.clj @@ -20,8 +20,9 @@ ["snapshots" {:url ~sonatype-snapshots :creds :gpg}]] :plugins [[com.github.luxlang/lein-luxc ~version]] - :dependencies [[com.github.luxlang/luxc-jvm ~version] - [com.github.luxlang/stdlib ~version]] + :dependencies [[com.github.luxlang/lux-bootstrapper ~version] + [com.github.luxlang/stdlib ~version] + [org.openjdk.nashorn/nashorn-core "15.0"]] :manifest {"lux" ~version} :source-paths ["source"] diff --git a/lux-js/source/program.lux b/lux-js/source/program.lux index f75a78c97..e402a550f 100644 --- a/lux-js/source/program.lux +++ b/lux-js/source/program.lux @@ -1,5 +1,6 @@ (.module: [lux #* + [program (#+ program:)] ["." host (#+ import:)] ["." debug] [abstract @@ -9,17 +10,11 @@ ["." exception (#+ exception:)] ["." io (#+ IO io)] ["." function] - [parser - [cli (#+ program:)]] [concurrency ["." promise (#+ Promise)]]] [data ["." product] ["." maybe] - [number - ["." i64] - ["n" nat] - ["i" int]] [text ["%" format (#+ format)] ["." encoding]] @@ -27,8 +22,14 @@ ["." array (#+ Array)]]] [macro ["." template]] - [world - ["." file]] + [math + [number + ["n" nat] + ["i" int] + ["." i64]]] + ["." world #_ + ["." file] + ["#/." program]] ["@" target ["_" js]] [tool @@ -63,7 +64,7 @@ ["/." cli] ["/." static]]]) -(exception: (null-has-no-lux-representation {code (Maybe _.Expression)}) +(exception: (null_has_no_lux_representation {code (Maybe _.Expression)}) (case code (#.Some code) (_.code code) @@ -72,147 +73,158 @@ "???")) (for {@.old - (as-is (import: #long java/lang/String) + (as_is (import: java/lang/String) - (import: #long (java/lang/Class a)) + (import: (java/lang/Class a)) - (import: #long java/lang/Object - (toString [] java/lang/String) - (getClass [] (java/lang/Class java/lang/Object))) + (import: java/lang/Object + ["#::." + (toString [] java/lang/String) + (getClass [] (java/lang/Class java/lang/Object))]) - (import: #long java/lang/Long - (intValue [] java/lang/Integer)) + (import: java/lang/Long + ["#::." + (intValue [] java/lang/Integer)]) - (import: #long java/lang/Integer - (longValue [] long)) + (import: java/lang/Integer + ["#::." + (longValue [] long)]) - (import: #long java/lang/Number - (intValue [] java/lang/Integer) - (longValue [] long) - (doubleValue [] double)) + (import: java/lang/Number + ["#::." + (intValue [] java/lang/Integer) + (longValue [] long) + (doubleValue [] double)]) - (import: #long java/util/Arrays - (#static [t] copyOfRange [[t] int int] [t])) + (import: java/util/Arrays + ["#::." + (#static [t] copyOfRange [[t] int int] [t])]) - (import: #long javax/script/ScriptEngine - (eval [java/lang/String] #try #? java/lang/Object)) + (import: javax/script/ScriptEngine + ["#::." + (eval [java/lang/String] #try #? java/lang/Object)]) - (import: #long javax/script/ScriptEngineFactory - (getScriptEngine [] javax/script/ScriptEngine)) + (import: javax/script/ScriptEngineFactory + ["#::." + (getScriptEngine [] javax/script/ScriptEngine)]) - (import: #long jdk/nashorn/api/scripting/NashornScriptEngineFactory - (new [])) + (import: org/openjdk/nashorn/api/scripting/NashornScriptEngineFactory + ["#::." + (new [])]) - (import: #long jdk/nashorn/api/scripting/JSObject - (isArray [] boolean) - (isFunction [] boolean) - (getSlot [int] #? java/lang/Object) - (getMember [java/lang/String] #? java/lang/Object) - (hasMember [java/lang/String] boolean) - (call [#? java/lang/Object [java/lang/Object]] #try java/lang/Object)) + (import: org/openjdk/nashorn/api/scripting/JSObject + ["#::." + (isArray [] boolean) + (isFunction [] boolean) + (getSlot [int] #? java/lang/Object) + (getMember [java/lang/String] #? java/lang/Object) + (hasMember [java/lang/String] boolean) + (call [#? java/lang/Object [java/lang/Object]] #try java/lang/Object)]) - (import: #long jdk/nashorn/api/scripting/AbstractJSObject) + (import: org/openjdk/nashorn/api/scripting/AbstractJSObject) - (import: #long jdk/nashorn/api/scripting/ScriptObjectMirror - (size [] int) - (toString [] java/lang/String)) + (import: org/openjdk/nashorn/api/scripting/ScriptObjectMirror + ["#::." + (size [] int) + (toString [] java/lang/String)]) - (import: #long jdk/nashorn/internal/runtime/Undefined) + (import: org/openjdk/nashorn/internal/runtime/Undefined) (template [] [(host.interface: (getValue [] java/lang/Object)) (`` (import: (~~ (template.identifier ["program/" ])) - (getValue [] java/lang/Object)))] + ["#::." + (getValue [] java/lang/Object)]))] [IntValue] [StructureValue] ) - (exception: (unknown-member {member Text} + (exception: (unknown_member {member Text} {object java/lang/Object}) (exception.report ["Member" member] ["Object" (debug.inspect object)])) - (def: jvm-int + (def: jvm_int (-> (I64 Any) java/lang/Integer) (|>> (:coerce java/lang/Long) java/lang/Long::intValue)) - (def: (js-int value) - (-> Int jdk/nashorn/api/scripting/JSObject) - (host.object [] jdk/nashorn/api/scripting/AbstractJSObject [program/IntValue] + (def: (js_int value) + (-> Int org/openjdk/nashorn/api/scripting/JSObject) + (host.object [] org/openjdk/nashorn/api/scripting/AbstractJSObject [program/IntValue] [] ## Methods (program/IntValue [] (getValue self) java/lang/Object (:coerce java/lang/Object value)) - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (getMember self {member java/lang/String}) java/lang/Object (case member - (^ (static runtime.i64-high-field)) - (|> value .nat runtime.high jvm-int) + (^ (static runtime.i64_high_field)) + (|> value .nat runtime.high jvm_int) - (^ (static runtime.i64-low-field)) - (|> value .nat runtime.low jvm-int) + (^ (static runtime.i64_low_field)) + (|> value .nat runtime.low jvm_int) _ - (error! (exception.construct ..unknown-member [member (:coerce java/lang/Object value)])))) + (error! (exception.construct ..unknown_member [member (:coerce java/lang/Object value)])))) )) - (def: (::toString js-object) - (-> Any jdk/nashorn/api/scripting/JSObject) - (host.object [] jdk/nashorn/api/scripting/AbstractJSObject [] + (def: (::toString js_object) + (-> Any org/openjdk/nashorn/api/scripting/JSObject) + (host.object [] org/openjdk/nashorn/api/scripting/AbstractJSObject [] [] - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (isFunction self) boolean #1) - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (call self {this java/lang/Object} {args [java/lang/Object]}) java/lang/Object - (debug.inspect js-object)) + (debug.inspect js_object)) )) - (def: (::slice js-object value) - (-> (-> java/lang/Object jdk/nashorn/api/scripting/JSObject) (Array java/lang/Object) jdk/nashorn/api/scripting/JSObject) - (host.object [] jdk/nashorn/api/scripting/AbstractJSObject [] + (def: (::slice js_object value) + (-> (-> java/lang/Object org/openjdk/nashorn/api/scripting/JSObject) (Array java/lang/Object) org/openjdk/nashorn/api/scripting/JSObject) + (host.object [] org/openjdk/nashorn/api/scripting/AbstractJSObject [] [] - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (isFunction self) boolean #1) - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (call self {this java/lang/Object} {args [java/lang/Object]}) java/lang/Object (|> (java/util/Arrays::copyOfRange value (|> args (array.read 0) maybe.assume (:coerce Int)) (.int (array.size value))) - js-object + js_object (:coerce java/lang/Object))) )) - (def: (js-structure value) - (-> (Array java/lang/Object) jdk/nashorn/api/scripting/JSObject) - (let [js-object (: (-> java/lang/Object jdk/nashorn/api/scripting/JSObject) - (function (_ sub-value) - (<| (case (host.check [java/lang/Object] sub-value) - (#.Some sub-value) - (|> sub-value (:coerce (Array java/lang/Object)) js-structure) + (def: (js_structure value) + (-> (Array java/lang/Object) org/openjdk/nashorn/api/scripting/JSObject) + (let [js_object (: (-> java/lang/Object org/openjdk/nashorn/api/scripting/JSObject) + (function (_ sub_value) + (<| (case (host.check [java/lang/Object] sub_value) + (#.Some sub_value) + (|> sub_value (:coerce (Array java/lang/Object)) js_structure) #.None) - (case (host.check java/lang/Long sub-value) - (#.Some sub-value) - (|> sub-value (:coerce Int) js-int) + (case (host.check java/lang/Long sub_value) + (#.Some sub_value) + (|> sub_value (:coerce Int) js_int) #.None) ## else - (:coerce jdk/nashorn/api/scripting/JSObject sub-value))))] - (host.object [] jdk/nashorn/api/scripting/AbstractJSObject [program/StructureValue] + (:coerce org/openjdk/nashorn/api/scripting/JSObject sub_value))))] + (host.object [] org/openjdk/nashorn/api/scripting/AbstractJSObject [program/StructureValue] [] ## Methods (program/StructureValue [] (getValue self) java/lang/Object (:coerce (Array java/lang/Object) value)) - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (isArray self) boolean #1) - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (getMember self {member java/lang/String}) java/lang/Object (case member (^or "toJSON" "toString") @@ -220,16 +232,16 @@ (::toString value)) "length" - (jvm-int (array.size value)) + (jvm_int (array.size value)) "slice" (:coerce java/lang/Object - (::slice js-object value)) + (::slice js_object value)) - (^ (static runtime.variant-tag-field)) + (^ (static runtime.variant_tag_field)) (|> value (array.read 0) maybe.assume) - (^ (static runtime.variant-flag-field)) + (^ (static runtime.variant_flag_field)) (case (array.read 1 value) (#.Some set!) set! @@ -237,33 +249,33 @@ _ (host.null)) - (^ (static runtime.variant-value-field)) - (|> value (array.read 2) maybe.assume js-object (:coerce java/lang/Object)) + (^ (static runtime.variant_value_field)) + (|> value (array.read 2) maybe.assume js_object (:coerce java/lang/Object)) _ - (error! (exception.construct ..unknown-member [(:coerce Text member) (:coerce java/lang/Object value)]))) + (error! (exception.construct ..unknown_member [(:coerce Text member) (:coerce java/lang/Object value)]))) ) - (jdk/nashorn/api/scripting/AbstractJSObject + (org/openjdk/nashorn/api/scripting/AbstractJSObject [] (getSlot self {idx int}) java/lang/Object (|> value (array.read (|> idx java/lang/Integer::longValue (:coerce Nat))) maybe.assume - js-object + js_object (:coerce java/lang/Object))) ))) - (exception: undefined-has-no-lux-representation) + (exception: undefined_has_no_lux_representation) - (exception: (unknown-kind-of-host-object {object java/lang/Object}) + (exception: (unknown_kind_of_host_object {object java/lang/Object}) (exception.report ["Class" (java/lang/Object::toString (java/lang/Object::getClass object))] ["Object" (java/lang/Object::toString object)])) - (def: (check-int js-object) - (-> jdk/nashorn/api/scripting/ScriptObjectMirror + (def: (check_int js_object) + (-> org/openjdk/nashorn/api/scripting/ScriptObjectMirror (Maybe Int)) - (case [(jdk/nashorn/api/scripting/JSObject::getMember [runtime.i64-high-field] js-object) - (jdk/nashorn/api/scripting/JSObject::getMember [runtime.i64-low-field] js-object)] + (case [(org/openjdk/nashorn/api/scripting/JSObject::getMember [runtime.i64_high_field] js_object) + (org/openjdk/nashorn/api/scripting/JSObject::getMember [runtime.i64_low_field] js_object)] (^multi [(#.Some high) (#.Some low)] [[(host.check java/lang/Number high) (host.check java/lang/Number low)] @@ -271,25 +283,25 @@ [[(java/lang/Number::longValue high) (java/lang/Number::longValue low)] [high low]]) - (#.Some (.int (n.+ (|> high .nat (i64.left-shift 32)) + (#.Some (.int (n.+ (|> high .nat (i64.left_shift 32)) (if (i.< +0 (.int low)) - (|> low .nat (i64.left-shift 32) (i64.logic-right-shift 32)) + (|> low .nat (i64.left_shift 32) (i64.logic_right_shift 32)) (.nat low))))) _ #.None)) - (def: (check-variant lux-object js-object) + (def: (check_variant lux_object js_object) (-> (-> java/lang/Object (Try Any)) - jdk/nashorn/api/scripting/ScriptObjectMirror + org/openjdk/nashorn/api/scripting/ScriptObjectMirror (Maybe Any)) - (case [(jdk/nashorn/api/scripting/JSObject::getMember [runtime.variant-tag-field] js-object) - (jdk/nashorn/api/scripting/JSObject::getMember [runtime.variant-flag-field] js-object) - (jdk/nashorn/api/scripting/JSObject::getMember [runtime.variant-value-field] js-object)] + (case [(org/openjdk/nashorn/api/scripting/JSObject::getMember [runtime.variant_tag_field] js_object) + (org/openjdk/nashorn/api/scripting/JSObject::getMember [runtime.variant_flag_field] js_object) + (org/openjdk/nashorn/api/scripting/JSObject::getMember [runtime.variant_value_field] js_object)] (^multi [(#.Some tag) ?flag (#.Some value)] [(host.check java/lang/Number tag) (#.Some tag)] - [(lux-object value) + [(lux_object value) (#.Some value)]) (#.Some [(java/lang/Number::intValue tag) (maybe.default (host.null) ?flag) @@ -298,26 +310,26 @@ _ #.None)) - (def: (check-array lux-object js-object) + (def: (check_array lux_object js_object) (-> (-> java/lang/Object (Try Any)) - jdk/nashorn/api/scripting/ScriptObjectMirror + org/openjdk/nashorn/api/scripting/ScriptObjectMirror (Maybe (Array java/lang/Object))) - (if (jdk/nashorn/api/scripting/JSObject::isArray js-object) - (let [num-keys (.nat (jdk/nashorn/api/scripting/ScriptObjectMirror::size js-object))] + (if (org/openjdk/nashorn/api/scripting/JSObject::isArray js_object) + (let [num_keys (.nat (org/openjdk/nashorn/api/scripting/ScriptObjectMirror::size js_object))] (loop [idx 0 output (: (Array java/lang/Object) - (array.new num-keys))] - (if (n.< num-keys idx) - (case (jdk/nashorn/api/scripting/JSObject::getMember (%.nat idx) js-object) + (array.new num_keys))] + (if (n.< num_keys idx) + (case (org/openjdk/nashorn/api/scripting/JSObject::getMember (%.nat idx) js_object) (#.Some member) - (case (host.check jdk/nashorn/internal/runtime/Undefined member) + (case (host.check org/openjdk/nashorn/internal/runtime/Undefined member) (#.Some _) (recur (inc idx) output) #.None - (case (lux-object member) - (#try.Success parsed-member) - (recur (inc idx) (array.write idx (:coerce java/lang/Object parsed-member) output)) + (case (lux_object member) + (#try.Success parsed_member) + (recur (inc idx) (array.write! idx (:coerce java/lang/Object parsed_member) output)) (#try.Failure error) #.None)) @@ -327,102 +339,102 @@ (#.Some output)))) #.None)) - (def: (lux-object js-object) + (def: (lux_object js_object) (-> java/lang/Object (Try Any)) - (`` (<| (if (host.null? js-object) - (exception.throw ..null-has-no-lux-representation [#.None])) - (case (host.check jdk/nashorn/internal/runtime/Undefined js-object) + (`` (<| (if (host.null? js_object) + (exception.throw ..null_has_no_lux_representation [#.None])) + (case (host.check org/openjdk/nashorn/internal/runtime/Undefined js_object) (#.Some _) - (exception.throw ..undefined-has-no-lux-representation []) + (exception.throw ..undefined_has_no_lux_representation []) #.None) (~~ (template [] - [(case (host.check js-object) - (#.Some js-object) - (exception.return js-object) + [(case (host.check js_object) + (#.Some js_object) + (exception.return js_object) #.None)] [java/lang/Boolean] [java/lang/String])) (~~ (template [ ] - [(case (host.check js-object) - (#.Some js-object) - (exception.return ( js-object)) + [(case (host.check js_object) + (#.Some js_object) + (exception.return ( js_object)) #.None)] [java/lang/Number java/lang/Number::doubleValue] - [StructureValue StructureValue::getValue] - [IntValue IntValue::getValue])) - (case (host.check jdk/nashorn/api/scripting/ScriptObjectMirror js-object) - (#.Some js-object) - (case (check-int js-object) + [program/StructureValue program/StructureValue::getValue] + [program/IntValue program/IntValue::getValue])) + (case (host.check org/openjdk/nashorn/api/scripting/ScriptObjectMirror js_object) + (#.Some js_object) + (case (check_int js_object) (#.Some value) (exception.return value) #.None - (case (check-variant lux-object js-object) + (case (check_variant lux_object js_object) (#.Some value) (exception.return value) #.None - (case (check-array lux-object js-object) + (case (check_array lux_object js_object) (#.Some value) (exception.return value) #.None - (if (jdk/nashorn/api/scripting/JSObject::isFunction js-object) - (exception.return js-object) - (exception.throw ..unknown-kind-of-host-object (:coerce java/lang/Object js-object)))))) + (if (org/openjdk/nashorn/api/scripting/JSObject::isFunction js_object) + (exception.return js_object) + (exception.throw ..unknown_kind_of_host_object (:coerce java/lang/Object js_object)))))) #.None) ## else - (exception.throw ..unknown-kind-of-host-object (:coerce java/lang/Object js-object)) + (exception.throw ..unknown_kind_of_host_object (:coerce java/lang/Object js_object)) ))) - (def: (ensure-function function) - (-> Any (Maybe jdk/nashorn/api/scripting/JSObject)) + (def: (ensure_function function) + (-> Any (Maybe org/openjdk/nashorn/api/scripting/JSObject)) (do maybe.monad [function (|> function (:coerce java/lang/Object) - (host.check jdk/nashorn/api/scripting/JSObject))] - (if (jdk/nashorn/api/scripting/JSObject::isFunction function) + (host.check org/openjdk/nashorn/api/scripting/JSObject))] + (if (org/openjdk/nashorn/api/scripting/JSObject::isFunction function) (#.Some function) #.None))) ) @.js - (as-is)}) + (as_is)}) (for {@.old - (as-is (def: (call-macro inputs lux macro) - (-> (List Code) Lux jdk/nashorn/api/scripting/JSObject (Try (Try [Lux (List Code)]))) - (let [to-js (: (-> Any java/lang/Object) - (|>> (:coerce (Array java/lang/Object)) js-structure (:coerce java/lang/Object)))] + (as_is (def: (call_macro inputs lux macro) + (-> (List Code) Lux org/openjdk/nashorn/api/scripting/JSObject (Try (Try [Lux (List Code)]))) + (let [to_js (: (-> Any java/lang/Object) + (|>> (:coerce (Array java/lang/Object)) js_structure (:coerce java/lang/Object)))] (<| (:coerce (Try (Try [Lux (List Code)]))) - (jdk/nashorn/api/scripting/JSObject::call #.None - (|> (array.new 2) - (: (Array java/lang/Object)) - (array.write 0 (to-js inputs)) - (array.write 1 (to-js lux))) - macro)))) - - (exception: (cannot-apply-a-non-function {object java/lang/Object}) + (org/openjdk/nashorn/api/scripting/JSObject::call #.None + (|> (array.new 2) + (: (Array java/lang/Object)) + (array.write! 0 (to_js inputs)) + (array.write! 1 (to_js lux))) + macro)))) + + (exception: (cannot_apply_a_non_function {object java/lang/Object}) (exception.report ["Object" (java/lang/Object::toString object)])) (def: (expander macro inputs lux) Expander - (case (..ensure-function macro) + (case (..ensure_function macro) (#.Some macro) - (case (call-macro inputs lux macro) + (case (call_macro inputs lux macro) (#try.Success output) (|> output (:coerce java/lang/Object) - lux-object + lux_object (:coerce (Try (Try [Lux (List Code)])))) (#try.Failure error) (#try.Failure error)) #.None - (exception.throw ..cannot-apply-a-non-function (:coerce java/lang/Object macro)))) + (exception.throw ..cannot_apply_a_non_function (:coerce java/lang/Object macro)))) ) @.js @@ -432,16 +444,16 @@ }) (for {@.old - (as-is (def: (evaluate! interpreter alias input) + (as_is (def: (evaluate! interpreter alias input) (-> javax/script/ScriptEngine Context _.Expression (Try Any)) (do try.monad [?output (javax/script/ScriptEngine::eval (_.code input) interpreter)] (case ?output (#.Some output) - (..lux-object output) + (..lux_object output) #.None - (exception.throw ..null-has-no-lux-representation [(#.Some input)])))) + (exception.throw ..null_has_no_lux_representation [(#.Some input)])))) (def: (execute! interpreter input) (-> javax/script/ScriptEngine _.Statement (Try Any)) @@ -462,7 +474,7 @@ (def: host (IO (Host _.Expression _.Statement)) (io (let [interpreter (javax/script/ScriptEngineFactory::getScriptEngine - (jdk/nashorn/api/scripting/NashornScriptEngineFactory::new))] + (org/openjdk/nashorn/api/scripting/NashornScriptEngineFactory::new))] (: (Host _.Expression _.Statement) (structure (def: evaluate! (..evaluate! interpreter)) @@ -470,19 +482,19 @@ (def: define! (..define! interpreter)) (def: (ingest context content) - (|> content encoding.from-utf8 try.assume (:coerce _.Statement))) + (|> content (\ encoding.utf8 decode) try.assume (:coerce _.Statement))) - (def: (re-learn context content) + (def: (re_learn context content) (..execute! interpreter content)) - (def: (re-load context content) + (def: (re_load context content) (do try.monad [_ (..execute! interpreter content)] (..evaluate! interpreter context (_.var (reference.artifact context)))))))))) ) @.js - (as-is (def: (eval code) + (as_is (def: (eval code) (-> Text (Maybe Any)) ## Note: I have to call "eval" this way ## in order to avoid a quirk of calling eval in Node @@ -501,7 +513,7 @@ (wrap output) #.None - (exception.throw ..null-has-no-lux-representation [(#.Some input)])))) + (exception.throw ..null_has_no_lux_representation [(#.Some input)])))) (def: (execute! input) (-> _.Statement (Try Any)) @@ -528,12 +540,12 @@ (def: define! ..define!) (def: (ingest context content) - (|> content encoding.from-utf8 try.assume (:coerce _.Statement))) + (|> content encoding.from_utf8 try.assume (:coerce _.Statement))) - (def: (re-learn context content) + (def: (re_learn context content) (..execute! content)) - (def: (re-load context content) + (def: (re_load context content) (do try.monad [_ (..execute! content)] (..evaluate! context (_.var (reference.artifact context))))))))) @@ -543,22 +555,22 @@ (IO (Platform [Register Text] _.Expression _.Statement)) (do io.monad [host ..host] - (wrap {#platform.&file-system (file.async file.system) + (wrap {#platform.&file_system (file.async file.default) #platform.host host #platform.phase js.generate #platform.runtime runtime.generate - #platform.write (|>> _.code encoding.to-utf8)}))) + #platform.write (|>> _.code (\ encoding.utf8 encode))}))) (def: (program namer context program) (-> (-> Context Text) (Program _.Expression _.Statement)) (let [@process (_.var "process") - on-node-js? (|> (|> @process _.type-of (_.= (_.string "undefined")) _.not) + on_node_js? (|> (|> @process _.type_of (_.= (_.string "undefined")) _.not) (_.and (|> @process (_.the "argv")))) - node-js-inputs (|> @process (_.the "argv") (_.do "slice" (list (_.int +2)))) - no-inputs (_.array (list))] - (_.statement (_.apply/1 (_.apply/1 program (runtime.lux//program-args (_.? on-node-js? - node-js-inputs - no-inputs))) + node_js_inputs (|> @process (_.the "argv") (_.do "slice" (list (_.int +2)))) + no_inputs (_.array (list))] + (_.statement (_.apply/1 (_.apply/1 program (runtime.lux//program_args (_.? on_node_js? + node_js_inputs + no_inputs))) (_.string ""))))) (for {@.old @@ -577,35 +589,35 @@ try.assume (:coerce Try) (do try.monad - [handler (try.from-maybe (..ensure-function handler)) - #let [to-js (: (-> Any java/lang/Object) - (|>> (:coerce (Array java/lang/Object)) js-structure (:coerce java/lang/Object)))] - output (jdk/nashorn/api/scripting/JSObject::call #.None - (|> (array.new 5) - (: (Array java/lang/Object)) - (array.write 0 name) - (array.write 1 (to-js phase)) - (array.write 2 (to-js archive)) - (array.write 3 (to-js parameters)) - (array.write 4 (to-js state))) - handler)] - (lux-object (:coerce java/lang/Object output))))) + [handler (try.from_maybe (..ensure_function handler)) + #let [to_js (: (-> Any java/lang/Object) + (|>> (:coerce (Array java/lang/Object)) js_structure (:coerce java/lang/Object)))] + output (org/openjdk/nashorn/api/scripting/JSObject::call #.None + (|> (array.new 5) + (: (Array java/lang/Object)) + (array.write! 0 name) + (array.write! 1 (to_js phase)) + (array.write! 2 (to_js archive)) + (array.write! 3 (to_js parameters)) + (array.write! 4 (to_js state))) + handler)] + (lux_object (:coerce java/lang/Object output))))) @.js (def: (extender handler) Extender (:assume handler))}) -(def: (declare-success! _) +(def: (declare_success! _) (-> Any (Promise Any)) - (promise.future (io.exit +0))) + (promise.future (\ world/program.default exit +0))) (program: [{service /cli.service}] (exec (do promise.monad [_ (/.compiler {#/static.host @.js - #/static.host-module-extension ".js" + #/static.host_module_extension ".js" #/static.target (/cli.target service) - #/static.artifact-extension ".js"} + #/static.artifact_extension ".js"} ..expander analysis.bundle ..platform @@ -615,7 +627,7 @@ [(& Register Text) _.Expression _.Statement] ..extender service - [(packager.package _.use-strict _.code _.then) - (format (/cli.target service) (:: file.system separator) "program.js")])] - (..declare-success! [])) + [(packager.package _.use_strict _.code _.then) + (format (/cli.target service) (\ file.default separator) "program.js")])] + (..declare_success! [])) (io.io []))) diff --git a/lux-lein/src/leiningen/lux/utils.clj b/lux-lein/src/leiningen/lux/utils.clj index 23466e92f..e2ec2c1ca 100644 --- a/lux-lein/src/leiningen/lux/utils.clj +++ b/lux-lein/src/leiningen/lux/utils.clj @@ -118,10 +118,14 @@ compiler-path (prepare-path (find-compiler-path raw-paths)) class-path (->> compiler-dependencies (list* compiler-path) + (interpose java.io.File/pathSeparator) + (reduce str "") + sanitize-path) + module-path (->> program-dependencies (interpose java.io.File/pathSeparator) (reduce str "") sanitize-path)] - (str (java-command project) " -cp " class-path + (str (java-command project) " -cp " class-path " --module-path " module-path " " (lux-command project program-dependencies source-paths)))) compile-path (str "release " module) diff --git a/stdlib/source/lux/control/concatenative.lux b/stdlib/source/lux/control/concatenative.lux index fba2fe53e..ab6f6940f 100644 --- a/stdlib/source/lux/control/concatenative.lux +++ b/stdlib/source/lux/control/concatenative.lux @@ -12,11 +12,8 @@ [macro ["." code] [syntax (#+ syntax:) - ["cs" common - ["csr" reader] - ["csw" writer] - ["|.|" export] - ["|.|" annotations]]]] + ["|.|" export] + ["|.|" annotations]]] [math [number ["n" nat] diff --git a/stdlib/source/lux/control/concurrency/actor.lux b/stdlib/source/lux/control/concurrency/actor.lux index ebdc3d514..21c2b2d58 100644 --- a/stdlib/source/lux/control/concurrency/actor.lux +++ b/stdlib/source/lux/control/concurrency/actor.lux @@ -19,11 +19,9 @@ [macro ["." code] [syntax (#+ syntax:) - ["cs" common - ["csr" reader] - ["csw" writer] - ["|.|" export] - ["|.|" annotations]]]] + ["|.|" input] + ["|.|" export] + ["|.|" annotations]]] [math [number ["n" nat]]] @@ -342,7 +340,7 @@ (type: Signature {#vars (List Text) #name Text - #inputs (List cs.Typed_Input) + #inputs (List |input|.Input) #state Text #self Text #output Code}) @@ -352,7 +350,7 @@ (.form ($_ <>.and (<>.default (list) (.tuple (<>.some .local_identifier))) .local_identifier - (<>.some csr.typed_input) + (<>.some |input|.parser) .local_identifier .local_identifier .any))) @@ -379,9 +377,9 @@ #let [g!type (code.local_identifier (get@ #abstract.name actor_scope)) g!message (code.local_identifier (get@ #name signature)) g!actor_vars (get@ #abstract.type_vars actor_scope) - g!all_vars (|> (get@ #vars signature) (list\map code.local_identifier) (list\compose g!actor_vars)) - g!inputsC (|> (get@ #inputs signature) (list\map product.left)) - g!inputsT (|> (get@ #inputs signature) (list\map product.right)) + g!all_vars (|> signature (get@ #vars) (list\map code.local_identifier) (list\compose g!actor_vars)) + g!inputsC (|> signature (get@ #inputs) (list\map product.left)) + g!inputsT (|> signature (get@ #inputs) (list\map product.right)) g!state (|> signature (get@ #state) code.local_identifier) g!self (|> signature (get@ #self) code.local_identifier)]] (wrap (list (` (def: (~+ (|export|.write export)) ((~ g!message) (~+ g!inputsC)) diff --git a/stdlib/source/lux/control/exception.lux b/stdlib/source/lux/control/exception.lux index 63f4a0853..dcbb6ecfc 100644 --- a/stdlib/source/lux/control/exception.lux +++ b/stdlib/source/lux/control/exception.lux @@ -15,12 +15,10 @@ [macro ["." code] [syntax (#+ syntax:) - ["sc" common - ["scr" reader] - ["scw" writer] - ["|.|" export] - ["." type #_ - ["|#_.|" variable]]]]] + ["|.|" export] + ["|.|" input] + ["." type #_ + ["|#_.|" variable]]]] [math [number ["n" nat ("#\." decimal)]]]] @@ -90,7 +88,7 @@ (syntax: #export (exception: {export |export|.parser} {t_vars (p.default (list) (s.tuple (p.some |type_variable|.parser)))} {[name inputs] (p.either (p.and s.local_identifier (wrap (list))) - (s.form (p.and s.local_identifier (p.some scr.typed_input))))} + (s.form (p.and s.local_identifier (p.some |input|.parser))))} {body (p.maybe s.any)}) {#.doc (doc "Define a new exception type." "It mostly just serves as a way to tag error messages for later catching." @@ -109,10 +107,10 @@ (wrap (list (` (def: (~+ (|export|.write export)) (~ g!self) (All [(~+ (list\map |type_variable|.format t_vars))] - (..Exception [(~+ (list\map (get@ #sc.input_type) inputs))])) + (..Exception [(~+ (list\map (get@ #|input|.type) inputs))])) (let [(~ g!descriptor) (~ (code.text descriptor))] {#..label (~ g!descriptor) - #..constructor (function ((~ g!self) [(~+ (list\map (get@ #sc.input_binding) inputs))]) + #..constructor (function ((~ g!self) [(~+ (list\map (get@ #|input|.binding) inputs))]) ((~! text\compose) (~ g!descriptor) (~ (maybe.default (' "") body))))}))))) ))) diff --git a/stdlib/source/lux/control/security/capability.lux b/stdlib/source/lux/control/security/capability.lux index 8f2430bff..b94bd79cf 100644 --- a/stdlib/source/lux/control/security/capability.lux +++ b/stdlib/source/lux/control/security/capability.lux @@ -19,12 +19,9 @@ [macro ["." code] [syntax (#+ syntax:) - [common - ["." reader] - ["." writer] - ["|.|" export] - ["|.|" declaration] - ["|.|" annotations]]]]]) + ["|.|" export] + ["|.|" declaration] + ["|.|" annotations]]]]) (abstract: #export (Capability brand input output) (-> input output) diff --git a/stdlib/source/lux/macro/poly.lux b/stdlib/source/lux/macro/poly.lux index a50493fc6..8f571f61c 100644 --- a/stdlib/source/lux/macro/poly.lux +++ b/stdlib/source/lux/macro/poly.lux @@ -18,10 +18,7 @@ [macro ["." code] [syntax (#+ syntax:) - [common - ["csr" reader] - ["csw" writer] - ["|.|" export]]]] + ["|.|" export]]] [math [number ["n" nat]]]]) diff --git a/stdlib/source/lux/macro/syntax/annotations.lux b/stdlib/source/lux/macro/syntax/annotations.lux new file mode 100644 index 000000000..e1ee52274 --- /dev/null +++ b/stdlib/source/lux/macro/syntax/annotations.lux @@ -0,0 +1,41 @@ +(.module: + [lux #* + [abstract + [equivalence (#+ Equivalence)]] + [control + ["." function] + ["<>" parser + ["<.>" code (#+ Parser)]]] + [data + ["." product] + ["." name] + [collection + ["." list ("#\." functor)]]] + [macro + ["." code]]]) + +(type: #export Annotations + (List [Name Code])) + +(def: #export equivalence + (Equivalence Annotations) + (list.equivalence + (product.equivalence name.equivalence + code.equivalence))) + +(def: #export empty + Annotations + (list)) + +(def: #export write + (-> Annotations Code) + (let [entry (product.both code.tag function.identity)] + (|>> (list\map entry) + code.record))) + +(def: #export parser + (Parser Annotations) + (.record + (<>.some + (<>.and .tag + .any)))) diff --git a/stdlib/source/lux/macro/syntax/check.lux b/stdlib/source/lux/macro/syntax/check.lux new file mode 100644 index 000000000..081e394b0 --- /dev/null +++ b/stdlib/source/lux/macro/syntax/check.lux @@ -0,0 +1,41 @@ +(.module: + [lux #* + ["." meta] + [abstract + [equivalence (#+ Equivalence)] + [monad (#+ do)]] + [control + ["." exception (#+ exception:)] + ["<>" parser + ["<.>" code (#+ Parser)]]] + [data + ["." product]] + [macro + ["." code]]]) + +(def: extension + "lux check") + +(type: #export Check + {#type Code + #value Code}) + +(def: #export equivalence + (Equivalence Check) + ($_ product.equivalence + code.equivalence + code.equivalence + )) + +(def: #export (write (^slots [#type #value])) + (-> Check Code) + (` ((~ (code.text ..extension)) + (~ type) + (~ value)))) + +(def: #export parser + (Parser Check) + (<| .form + (<>.after (.text! ..extension)) + (<>.and .any + .any))) diff --git a/stdlib/source/lux/macro/syntax/common.lux b/stdlib/source/lux/macro/syntax/common.lux deleted file mode 100644 index 8cfbdeddd..000000000 --- a/stdlib/source/lux/macro/syntax/common.lux +++ /dev/null @@ -1,7 +0,0 @@ -(.module: {#.doc (.doc "Commons syntax readers and writers." - "The goal is to be able to reuse common syntax in macro definitions across libraries.")} - [lux #*]) - -(type: #export Typed_Input - {#input_binding Code - #input_type Code}) diff --git a/stdlib/source/lux/macro/syntax/common/annotations.lux b/stdlib/source/lux/macro/syntax/common/annotations.lux deleted file mode 100644 index e1ee52274..000000000 --- a/stdlib/source/lux/macro/syntax/common/annotations.lux +++ /dev/null @@ -1,41 +0,0 @@ -(.module: - [lux #* - [abstract - [equivalence (#+ Equivalence)]] - [control - ["." function] - ["<>" parser - ["<.>" code (#+ Parser)]]] - [data - ["." product] - ["." name] - [collection - ["." list ("#\." functor)]]] - [macro - ["." code]]]) - -(type: #export Annotations - (List [Name Code])) - -(def: #export equivalence - (Equivalence Annotations) - (list.equivalence - (product.equivalence name.equivalence - code.equivalence))) - -(def: #export empty - Annotations - (list)) - -(def: #export write - (-> Annotations Code) - (let [entry (product.both code.tag function.identity)] - (|>> (list\map entry) - code.record))) - -(def: #export parser - (Parser Annotations) - (.record - (<>.some - (<>.and .tag - .any)))) diff --git a/stdlib/source/lux/macro/syntax/common/check.lux b/stdlib/source/lux/macro/syntax/common/check.lux deleted file mode 100644 index 081e394b0..000000000 --- a/stdlib/source/lux/macro/syntax/common/check.lux +++ /dev/null @@ -1,41 +0,0 @@ -(.module: - [lux #* - ["." meta] - [abstract - [equivalence (#+ Equivalence)] - [monad (#+ do)]] - [control - ["." exception (#+ exception:)] - ["<>" parser - ["<.>" code (#+ Parser)]]] - [data - ["." product]] - [macro - ["." code]]]) - -(def: extension - "lux check") - -(type: #export Check - {#type Code - #value Code}) - -(def: #export equivalence - (Equivalence Check) - ($_ product.equivalence - code.equivalence - code.equivalence - )) - -(def: #export (write (^slots [#type #value])) - (-> Check Code) - (` ((~ (code.text ..extension)) - (~ type) - (~ value)))) - -(def: #export parser - (Parser Check) - (<| .form - (<>.after (.text! ..extension)) - (<>.and .any - .any))) diff --git a/stdlib/source/lux/macro/syntax/common/declaration.lux b/stdlib/source/lux/macro/syntax/common/declaration.lux deleted file mode 100644 index 9a72a8a0c..000000000 --- a/stdlib/source/lux/macro/syntax/common/declaration.lux +++ /dev/null @@ -1,46 +0,0 @@ -(.module: - [lux #* - [abstract - [equivalence (#+ Equivalence)]] - [control - ["<>" parser ("#\." monad) - ["<.>" code (#+ Parser)]]] - [data - ["." product] - ["." text] - [collection - ["." list ("#\." functor)]]] - [macro - ["." code]]]) - -(type: #export Declaration - {#name Text - #arguments (List Text)}) - -(def: #export equivalence - (Equivalence Declaration) - ($_ product.equivalence - text.equivalence - (list.equivalence text.equivalence) - )) - -(def: #export parser - {#.doc (doc "A parser for declaration syntax." - "Such as:" - quux - (foo bar baz))} - (Parser Declaration) - (<>.either (<>.and .local_identifier - (<>\wrap (list))) - (.form (<>.and .local_identifier - (<>.some .local_identifier))))) - -(def: #export (write value) - (-> Declaration Code) - (let [g!name (code.local_identifier (get@ #name value))] - (case (get@ #arguments value) - #.Nil - g!name - - arguments - (` ((~ g!name) (~+ (list\map code.local_identifier arguments))))))) diff --git a/stdlib/source/lux/macro/syntax/common/definition.lux b/stdlib/source/lux/macro/syntax/common/definition.lux deleted file mode 100644 index cdb382dc1..000000000 --- a/stdlib/source/lux/macro/syntax/common/definition.lux +++ /dev/null @@ -1,141 +0,0 @@ -(.module: - [lux (#- Definition) - ["." meta] - [abstract - [equivalence (#+ Equivalence)] - [monad (#+ do)]] - [control - ["." exception (#+ exception:)] - ["<>" parser - ["<.>" code (#+ Parser)]]] - [data - ["." sum] - ["." product] - ["." bit] - ["." name] - ["." text - ["%" format (#+ format)]] - [collection - ["." list]]] - [macro - ["." code]] - [meta - ["." location]]] - ["." // - ["#." annotations (#+ Annotations)] - ["#." check (#+ Check)]]) - -(type: #export Definition - {#name Text - #value (Either Check - Code) - #anns Annotations - #export? Bit}) - -(def: #export equivalence - (Equivalence Definition) - ($_ product.equivalence - text.equivalence - ($_ sum.equivalence - //check.equivalence - code.equivalence - ) - //annotations.equivalence - bit.equivalence - )) - -(def: extension - "lux def") - -(def: (write_tag [module short]) - (-> Name Code) - (` [(~ (code.text module)) - (~ (code.text short))])) - -(def: (write_annotations value) - (-> Annotations Code) - (case value - #.Nil - (` #.Nil) - - (#.Cons [name value] tail) - (` (#.Cons [(~ (..write_tag name)) - (~ value)] - (~ (write_annotations tail)))))) - -(def: dummy - Code - (` {#.module (~ (code.text (get@ #.module location.dummy))) - #.line (~ (code.nat (get@ #.line location.dummy))) - #.column (~ (code.nat (get@ #.column location.dummy)))})) - -(def: #export (write (^slots [#name #value #anns #export?])) - (-> Definition Code) - (` ((~ (code.text ..extension)) - (~ (code.local_identifier name)) - (~ (case value - (#.Left check) - (//check.write check) - - (#.Right value) - value)) - [(~ ..dummy) (#.Record (~ (..write_annotations anns)))] - (~ (code.bit export?))))) - -(def: tag_parser - (Parser Name) - (.tuple (<>.and .text .text))) - -(def: annotations_parser - (Parser Annotations) - (<>.rec - (function (_ recur) - ($_ <>.or - (.tag! (name_of #.Nil)) - (.form (do <>.monad - [_ (.tag! (name_of #.Cons)) - [head tail] (<>.and (.tuple (<>.and tag_parser .any)) - recur)] - (wrap [head tail]))) - )))) - -(def: #export (parser compiler) - {#.doc "A reader that first macro-expands and then analyses the input Code, to ensure it's a definition."} - (-> Lux (Parser Definition)) - (do {! <>.monad} - [raw .any - me_raw (|> raw - meta.expand_all - (meta.run compiler) - <>.lift)] - (<| (.local me_raw) - .form - (<>.after (.text! ..extension)) - ($_ <>.and - .local_identifier - (<>.or //check.parser - .any) - (<| .tuple - (<>.after .any) - .form - (<>.after (.this! (` #.Record))) - ..annotations_parser) - .bit - )))) - -(exception: #export (lacks_type! {definition Definition}) - (exception.report - ["Definition" (%.code (..write definition))])) - -(def: #export (typed compiler) - {#.doc "Only works for typed definitions."} - (-> Lux (Parser Definition)) - (do <>.monad - [definition (..parser compiler) - _ (case (get@ #value definition) - (#.Left _) - (wrap []) - - (#.Right _) - (<>.lift (exception.throw ..lacks_type! [definition])))] - (wrap definition))) diff --git a/stdlib/source/lux/macro/syntax/common/export.lux b/stdlib/source/lux/macro/syntax/common/export.lux deleted file mode 100644 index e89f908e4..000000000 --- a/stdlib/source/lux/macro/syntax/common/export.lux +++ /dev/null @@ -1,20 +0,0 @@ -(.module: - [lux #* - [control - ["<>" parser ("#\." monad) - ["<.>" code (#+ Parser)]]]]) - -(def: token - (' #export)) - -(def: #export (write exported?) - (-> Bit (List Code)) - (if exported? - (list ..token) - (list))) - -(def: #export parser - (Parser Bit) - (<>.either (<>.after (.this! ..token) - (<>\wrap true)) - (<>\wrap false))) diff --git a/stdlib/source/lux/macro/syntax/common/reader.lux b/stdlib/source/lux/macro/syntax/common/reader.lux deleted file mode 100644 index cd7ca1dce..000000000 --- a/stdlib/source/lux/macro/syntax/common/reader.lux +++ /dev/null @@ -1,20 +0,0 @@ -(.module: {#.doc "Commons syntax readers."} - [lux #* - [abstract - monad] - [control - ["p" parser ("#\." monad) - ["s" code (#+ Parser)]]] - [data - ["." name ("#\." equivalence)] - ["." product] - ["." maybe] - [collection - ["." list]]] - ["." meta]] - ["." //]) - -(def: #export typed_input - {#.doc "Reader for the common typed-argument syntax used by many macros."} - (Parser //.Typed_Input) - (s.record (p.and s.any s.any))) diff --git a/stdlib/source/lux/macro/syntax/common/type/variable.lux b/stdlib/source/lux/macro/syntax/common/type/variable.lux deleted file mode 100644 index 22f37a35c..000000000 --- a/stdlib/source/lux/macro/syntax/common/type/variable.lux +++ /dev/null @@ -1,27 +0,0 @@ -(.module: - [lux #* - [abstract - [equivalence (#+ Equivalence)]] - [control - [parser - ["<.>" code (#+ Parser)]]] - [data - ["." text]] - [macro - ["." code]]]) - -(type: #export Variable - Text) - -(def: #export equivalence - (Equivalence Variable) - text.equivalence) - -(def: #export format - (-> Variable Code) - code.local_identifier) - -(def: #export parser - {#.doc "Parser for the common type variable/parameter used by many macros."} - (Parser Variable) - .local_identifier) diff --git a/stdlib/source/lux/macro/syntax/common/writer.lux b/stdlib/source/lux/macro/syntax/common/writer.lux deleted file mode 100644 index 18b6556b8..000000000 --- a/stdlib/source/lux/macro/syntax/common/writer.lux +++ /dev/null @@ -1,17 +0,0 @@ -(.module: - {#.doc "Commons syntax writers."} - [lux #* - [control - ["." function]] - [data - [collection - ["." list ("#\." functor)]] - ["." product]] - [macro - ["." code]]] - ["." //]) - -(def: #export (typed_input value) - (-> //.Typed_Input Code) - (code.record (list [(get@ #//.input_binding value) - (get@ #//.input_type value)]))) diff --git a/stdlib/source/lux/macro/syntax/declaration.lux b/stdlib/source/lux/macro/syntax/declaration.lux new file mode 100644 index 000000000..9a72a8a0c --- /dev/null +++ b/stdlib/source/lux/macro/syntax/declaration.lux @@ -0,0 +1,46 @@ +(.module: + [lux #* + [abstract + [equivalence (#+ Equivalence)]] + [control + ["<>" parser ("#\." monad) + ["<.>" code (#+ Parser)]]] + [data + ["." product] + ["." text] + [collection + ["." list ("#\." functor)]]] + [macro + ["." code]]]) + +(type: #export Declaration + {#name Text + #arguments (List Text)}) + +(def: #export equivalence + (Equivalence Declaration) + ($_ product.equivalence + text.equivalence + (list.equivalence text.equivalence) + )) + +(def: #export parser + {#.doc (doc "A parser for declaration syntax." + "Such as:" + quux + (foo bar baz))} + (Parser Declaration) + (<>.either (<>.and .local_identifier + (<>\wrap (list))) + (.form (<>.and .local_identifier + (<>.some .local_identifier))))) + +(def: #export (write value) + (-> Declaration Code) + (let [g!name (code.local_identifier (get@ #name value))] + (case (get@ #arguments value) + #.Nil + g!name + + arguments + (` ((~ g!name) (~+ (list\map code.local_identifier arguments))))))) diff --git a/stdlib/source/lux/macro/syntax/definition.lux b/stdlib/source/lux/macro/syntax/definition.lux new file mode 100644 index 000000000..cdb382dc1 --- /dev/null +++ b/stdlib/source/lux/macro/syntax/definition.lux @@ -0,0 +1,141 @@ +(.module: + [lux (#- Definition) + ["." meta] + [abstract + [equivalence (#+ Equivalence)] + [monad (#+ do)]] + [control + ["." exception (#+ exception:)] + ["<>" parser + ["<.>" code (#+ Parser)]]] + [data + ["." sum] + ["." product] + ["." bit] + ["." name] + ["." text + ["%" format (#+ format)]] + [collection + ["." list]]] + [macro + ["." code]] + [meta + ["." location]]] + ["." // + ["#." annotations (#+ Annotations)] + ["#." check (#+ Check)]]) + +(type: #export Definition + {#name Text + #value (Either Check + Code) + #anns Annotations + #export? Bit}) + +(def: #export equivalence + (Equivalence Definition) + ($_ product.equivalence + text.equivalence + ($_ sum.equivalence + //check.equivalence + code.equivalence + ) + //annotations.equivalence + bit.equivalence + )) + +(def: extension + "lux def") + +(def: (write_tag [module short]) + (-> Name Code) + (` [(~ (code.text module)) + (~ (code.text short))])) + +(def: (write_annotations value) + (-> Annotations Code) + (case value + #.Nil + (` #.Nil) + + (#.Cons [name value] tail) + (` (#.Cons [(~ (..write_tag name)) + (~ value)] + (~ (write_annotations tail)))))) + +(def: dummy + Code + (` {#.module (~ (code.text (get@ #.module location.dummy))) + #.line (~ (code.nat (get@ #.line location.dummy))) + #.column (~ (code.nat (get@ #.column location.dummy)))})) + +(def: #export (write (^slots [#name #value #anns #export?])) + (-> Definition Code) + (` ((~ (code.text ..extension)) + (~ (code.local_identifier name)) + (~ (case value + (#.Left check) + (//check.write check) + + (#.Right value) + value)) + [(~ ..dummy) (#.Record (~ (..write_annotations anns)))] + (~ (code.bit export?))))) + +(def: tag_parser + (Parser Name) + (.tuple (<>.and .text .text))) + +(def: annotations_parser + (Parser Annotations) + (<>.rec + (function (_ recur) + ($_ <>.or + (.tag! (name_of #.Nil)) + (.form (do <>.monad + [_ (.tag! (name_of #.Cons)) + [head tail] (<>.and (.tuple (<>.and tag_parser .any)) + recur)] + (wrap [head tail]))) + )))) + +(def: #export (parser compiler) + {#.doc "A reader that first macro-expands and then analyses the input Code, to ensure it's a definition."} + (-> Lux (Parser Definition)) + (do {! <>.monad} + [raw .any + me_raw (|> raw + meta.expand_all + (meta.run compiler) + <>.lift)] + (<| (.local me_raw) + .form + (<>.after (.text! ..extension)) + ($_ <>.and + .local_identifier + (<>.or //check.parser + .any) + (<| .tuple + (<>.after .any) + .form + (<>.after (.this! (` #.Record))) + ..annotations_parser) + .bit + )))) + +(exception: #export (lacks_type! {definition Definition}) + (exception.report + ["Definition" (%.code (..write definition))])) + +(def: #export (typed compiler) + {#.doc "Only works for typed definitions."} + (-> Lux (Parser Definition)) + (do <>.monad + [definition (..parser compiler) + _ (case (get@ #value definition) + (#.Left _) + (wrap []) + + (#.Right _) + (<>.lift (exception.throw ..lacks_type! [definition])))] + (wrap definition))) diff --git a/stdlib/source/lux/macro/syntax/export.lux b/stdlib/source/lux/macro/syntax/export.lux new file mode 100644 index 000000000..e89f908e4 --- /dev/null +++ b/stdlib/source/lux/macro/syntax/export.lux @@ -0,0 +1,20 @@ +(.module: + [lux #* + [control + ["<>" parser ("#\." monad) + ["<.>" code (#+ Parser)]]]]) + +(def: token + (' #export)) + +(def: #export (write exported?) + (-> Bit (List Code)) + (if exported? + (list ..token) + (list))) + +(def: #export parser + (Parser Bit) + (<>.either (<>.after (.this! ..token) + (<>\wrap true)) + (<>\wrap false))) diff --git a/stdlib/source/lux/macro/syntax/input.lux b/stdlib/source/lux/macro/syntax/input.lux new file mode 100644 index 000000000..9b9fcb576 --- /dev/null +++ b/stdlib/source/lux/macro/syntax/input.lux @@ -0,0 +1,37 @@ +(.module: + [lux #* + [abstract + [equivalence (#+ Equivalence)]] + [control + ["<>" parser + ["<.>" code (#+ Parser)]]] + [data + ["." product]] + [macro + ["." code]]]) + +(type: #export Input + {#binding Code + #type Code}) + +(def: #export equivalence + (Equivalence Input) + ($_ product.equivalence + code.equivalence + code.equivalence + )) + +(def: #export (format value) + (-> Input Code) + (code.record + (list [(get@ #binding value) + (get@ #type value)]))) + +(def: #export parser + {#.doc "Parser for the common typed-argument syntax used by many macros."} + (Parser Input) + (.record + ($_ <>.and + .any + .any + ))) diff --git a/stdlib/source/lux/macro/syntax/type/variable.lux b/stdlib/source/lux/macro/syntax/type/variable.lux new file mode 100644 index 000000000..22f37a35c --- /dev/null +++ b/stdlib/source/lux/macro/syntax/type/variable.lux @@ -0,0 +1,27 @@ +(.module: + [lux #* + [abstract + [equivalence (#+ Equivalence)]] + [control + [parser + ["<.>" code (#+ Parser)]]] + [data + ["." text]] + [macro + ["." code]]]) + +(type: #export Variable + Text) + +(def: #export equivalence + (Equivalence Variable) + text.equivalence) + +(def: #export format + (-> Variable Code) + code.local_identifier) + +(def: #export parser + {#.doc "Parser for the common type variable/parameter used by many macros."} + (Parser Variable) + .local_identifier) diff --git a/stdlib/source/lux/macro/template.lux b/stdlib/source/lux/macro/template.lux index 0e50c5d50..a98e1c2d0 100644 --- a/stdlib/source/lux/macro/template.lux +++ b/stdlib/source/lux/macro/template.lux @@ -4,13 +4,17 @@ [abstract ["." monad (#+ do)]] [control + ["." try (#+ Try)] + ["." exception (#+ exception:)] ["<>" parser ("#\." functor) ["<.>" code (#+ Parser)]]] [data ["." bit ("#\." codec)] ["." text] [collection - ["." list ("#\." monad)]]] + ["." list ("#\." monad fold)] + ["." dictionary (#+ Dictionary) + ["." plist]]]] [math [number ["." nat ("#\." decimal)] @@ -91,3 +95,124 @@ [identifier code.local_identifier code.identifier] [tag code.local_tag code.tag] ) + +(type: Environment + (Dictionary Text Code)) + +(def: (apply env template) + (-> Environment Code Code) + (case template + [_ (#.Identifier "" name)] + (case (dictionary.get name env) + (#.Some substitute) + substitute + + #.None + template) + + (^template [] + [[meta ( elems)] + [meta ( (list\map (apply env) elems))]]) + ([#.Tuple] + [#.Form]) + + [meta (#.Record members)] + [meta (#.Record (list\map (: (-> [Code Code] [Code Code]) + (function (_ [key value]) + [(apply env key) + (apply env value)])) + members))] + + _ + template)) + +(type: Local + {#name Text + #parameters (List Text) + #template Code}) + +(exception: #export (irregular_arguments {expected Nat} {actual Nat}) + (exception.report + ["Expected" (\ nat.decimal encode expected)] + ["Actual" (\ nat.decimal encode actual)])) + +(def: (macro (^slots [#parameters #template])) + (-> Local Macro') + (function (_ inputs compiler) + (let [parameters_count (list.size parameters) + inputs_count (list.size inputs)] + (if (nat.= parameters_count inputs_count) + (let [environment (: Environment + (|> (list.zip/2 parameters inputs) + (dictionary.from_list text.hash)))] + (#.Right [compiler (list (..apply environment template))])) + (exception.throw ..irregular_arguments [parameters_count inputs_count]))))) + +(def: local + (Parser Local) + (do <>.monad + [[name parameters] (.form (<>.and .local_identifier + (<>.many .local_identifier))) + template .any] + (wrap {#name name + #parameters parameters + #template template}))) + +(exception: #export (cannot_shadow_definition {module Text} {definition Text}) + (exception.report + ["Module" (text.encode module)] + ["Definition" (text.encode definition)])) + +(def: (push module_name local module) + (-> Text Local Module (Try Module)) + (let [definition (get@ #name local)] + (case (plist.get definition (get@ #.definitions module)) + #.None + (#try.Success (update@ #.definitions + (plist.put definition + (#.Definition [false .Macro (' []) (..macro local)])) + module)) + + (#.Some _) + (exception.throw ..cannot_shadow_definition [module_name definition])))) + +(syntax: (pop {locals (<>.some .text)}) + (do meta.monad + [here_name meta.current_module_name + here meta.current_module] + (function (_ compiler) + (#.Right [(let [definitions (list\fold plist.remove + (get@ #.definitions here) + locals)] + (update@ #.modules + (plist.put here_name (set@ #.definitions definitions here)) + compiler)) + (case (get@ #.expected compiler) + #.None + (list) + + (#.Some _) + (list (' [])))])))) + +(syntax: #export (with {locals (.tuple (<>.some ..local))} + body) + (do meta.monad + [here_name meta.current_module_name + here meta.current_module] + (meta.with_gensyms [g!body] + (function (_ compiler) + (do try.monad + [here (monad.fold try.monad (..push here_name) here locals) + #let [compiler (update@ #.modules (plist.put here_name here) compiler) + pop! (` ((~! ..pop) (~+ (list\map (|>> (get@ #name) code.text) + locals))))]] + (wrap [compiler + (case (get@ #.expected compiler) + #.None + (list body + pop!) + + (#.Some _) + (list (` (let [(~ g!body) (~ body)] + (exec (~ pop!) + (~ g!body))))))])))))) diff --git a/stdlib/source/lux/math/random.lux b/stdlib/source/lux/math/random.lux index 5af6de041..4b6670de7 100644 --- a/stdlib/source/lux/math/random.lux +++ b/stdlib/source/lux/math/random.lux @@ -29,7 +29,7 @@ ["r" ratio] ["c" complex] ["." i64]]] - [time + ["." time (#+ Time) ["." instant (#+ Instant)] ["." date (#+ Date)] ["." duration (#+ Duration)] @@ -305,6 +305,10 @@ (Random Date) (\ ..monad map instant.date ..instant)) +(def: #export time + (Random Time) + (\ ..monad map instant.time ..instant)) + (def: #export duration (Random Duration) (\ ..monad map duration.from_millis ..int)) diff --git a/stdlib/source/lux/time/date.lux b/stdlib/source/lux/time/date.lux index 41e66d4a8..48e4e7d41 100644 --- a/stdlib/source/lux/time/date.lux +++ b/stdlib/source/lux/time/date.lux @@ -34,8 +34,6 @@ (dictionary.new n.hash) //month.year)) -(exception: #export there_is_no_year_0) - (def: minimum_day 1) (def: (month_days year month) @@ -275,7 +273,7 @@ utc_year))) ## http://howardhinnant.github.io/date_algorithms.html -(def: #export (days date) +(def: #export (to_days date) (-> Date Int) (let [utc_month (|> date ..month //month.number) civil_year (..civil_year utc_month (..year date)) @@ -337,7 +335,7 @@ (def: &order ..order) (def: succ - (|>> ..days inc ..from_days)) + (|>> ..to_days inc ..from_days)) (def: pred - (|>> ..days dec ..from_days))) + (|>> ..to_days dec ..from_days))) diff --git a/stdlib/source/lux/time/instant.lux b/stdlib/source/lux/time/instant.lux index 33cd2e5a4..48bc5414a 100644 --- a/stdlib/source/lux/time/instant.lux +++ b/stdlib/source/lux/time/instant.lux @@ -129,7 +129,7 @@ (def: parser (Parser Instant) (do {! <>.monad} - [days (\ ! map date.days date.parser) + [days (\ ! map date.to_days date.parser) _ (.this ..date_suffix) time (\ ! map //.to_millis //.parser) _ (.this ..time_suffix)] @@ -190,5 +190,5 @@ (def: #export (from_date_time date time) (-> Date Time Instant) (..from_millis - (i.+ (i.* (date.days date) (duration.to_millis duration.day)) + (i.+ (i.* (date.to_days date) (duration.to_millis duration.day)) (.int (//.to_millis time))))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/extension/analysis/js.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/extension/analysis/js.lux index 708b93ddd..764479799 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/extension/analysis/js.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/extension/analysis/js.lux @@ -33,9 +33,9 @@ [.any (function (_ extension phase archive lengthC) (do phase.monad - [lengthA (type.with-type Nat + [lengthA (type.with_type Nat (phase archive lengthC)) - [var-id varT] (type.with-env check.var) + [var_id varT] (type.with_env check.var) _ (type.infer (type (Array varT)))] (wrap (#analysis.Extension extension (list lengthA)))))])) @@ -45,8 +45,8 @@ [.any (function (_ extension phase archive arrayC) (do phase.monad - [[var-id varT] (type.with-env check.var) - arrayA (type.with-type (type (Array varT)) + [[var_id varT] (type.with_env check.var) + arrayA (type.with_type (type (Array varT)) (phase archive arrayC)) _ (type.infer Nat)] (wrap (#analysis.Extension extension (list arrayA)))))])) @@ -57,10 +57,10 @@ [(<>.and .any .any) (function (_ extension phase archive [indexC arrayC]) (do phase.monad - [indexA (type.with-type Nat + [indexA (type.with_type Nat (phase archive indexC)) - [var-id varT] (type.with-env check.var) - arrayA (type.with-type (type (Array varT)) + [var_id varT] (type.with_env check.var) + arrayA (type.with_type (type (Array varT)) (phase archive arrayC)) _ (type.infer varT)] (wrap (#analysis.Extension extension (list indexA arrayA)))))])) @@ -71,12 +71,12 @@ [($_ <>.and .any .any .any) (function (_ extension phase archive [indexC valueC arrayC]) (do phase.monad - [indexA (type.with-type Nat + [indexA (type.with_type Nat (phase archive indexC)) - [var-id varT] (type.with-env check.var) - valueA (type.with-type varT + [var_id varT] (type.with_env check.var) + valueA (type.with_type varT (phase archive valueC)) - arrayA (type.with-type (type (Array varT)) + arrayA (type.with_type (type (Array varT)) (phase archive arrayC)) _ (type.infer (type (Array varT)))] (wrap (#analysis.Extension extension (list indexA valueA arrayA)))))])) @@ -87,10 +87,10 @@ [($_ <>.and .any .any) (function (_ extension phase archive [indexC arrayC]) (do phase.monad - [indexA (type.with-type Nat + [indexA (type.with_type Nat (phase archive indexC)) - [var-id varT] (type.with-env check.var) - arrayA (type.with-type (type (Array varT)) + [var_id varT] (type.with_env check.var) + arrayA (type.with_type (type (Array varT)) (phase archive arrayC)) _ (type.infer (type (Array varT)))] (wrap (#analysis.Extension extension (list indexA arrayA)))))])) @@ -112,9 +112,9 @@ [($_ <>.and .any (.tuple (<>.some .any))) (function (_ extension phase archive [constructorC inputsC]) (do {! phase.monad} - [constructorA (type.with-type Any + [constructorA (type.with_type Any (phase archive constructorC)) - inputsA (monad.map ! (|>> (phase archive) (type.with-type Any)) inputsC) + inputsA (monad.map ! (|>> (phase archive) (type.with_type Any)) inputsC) _ (type.infer .Any)] (wrap (#analysis.Extension extension (list& constructorA inputsA)))))])) @@ -124,7 +124,7 @@ [($_ <>.and .text .any) (function (_ extension phase archive [fieldC objectC]) (do phase.monad - [objectA (type.with-type Any + [objectA (type.with_type Any (phase archive objectC)) _ (type.infer .Any)] (wrap (#analysis.Extension extension (list (analysis.text fieldC) @@ -136,9 +136,9 @@ [($_ <>.and .text .any (.tuple (<>.some .any))) (function (_ extension phase archive [methodC objectC inputsC]) (do {! phase.monad} - [objectA (type.with-type Any + [objectA (type.with_type Any (phase archive objectC)) - inputsA (monad.map ! (|>> (phase archive) (type.with-type Any)) inputsC) + inputsA (monad.map ! (|>> (phase archive) (type.with_type Any)) inputsC) _ (type.infer .Any)] (wrap (#analysis.Extension extension (list& (analysis.text methodC) objectA @@ -172,19 +172,19 @@ [($_ <>.and .any (<>.some .any)) (function (_ extension phase archive [abstractionC inputsC]) (do {! phase.monad} - [abstractionA (type.with-type Any + [abstractionA (type.with_type Any (phase archive abstractionC)) - inputsA (monad.map ! (|>> (phase archive) (type.with-type Any)) inputsC) + inputsA (monad.map ! (|>> (phase archive) (type.with_type Any)) inputsC) _ (type.infer Any)] (wrap (#analysis.Extension extension (list& abstractionA inputsA)))))])) -(def: js::type-of +(def: js::type_of Handler (custom [.any (function (_ extension phase archive objectC) (do phase.monad - [objectA (type.with-type Any + [objectA (type.with_type Any (phase archive objectC)) _ (type.infer .Text)] (wrap (#analysis.Extension extension (list objectA)))))])) @@ -196,7 +196,7 @@ (function (_ extension phase archive [arity abstractionC]) (do phase.monad [#let [inputT (tuple (list.repeat arity Any))] - abstractionA (type.with-type (-> inputT Any) + abstractionA (type.with_type (-> inputT Any) (phase archive abstractionC)) _ (type.infer (for {@.js host.Function} Any))] @@ -209,7 +209,7 @@ (|> bundle.empty (bundle.install "constant" js::constant) (bundle.install "apply" js::apply) - (bundle.install "type-of" js::type-of) + (bundle.install "type-of" js::type_of) (bundle.install "function" js::function) (dictionary.merge bundle::array) (dictionary.merge bundle::object) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/common.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/common.lux index 1485d7230..03b2ca14b 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/common.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/common.lux @@ -8,11 +8,12 @@ ["" synthesis (#+ Parser)]]] [data ["." product] - [number - ["f" frac]] [collection ["." list ("#\." functor)] ["." dictionary]]] + [math + [number + ["f" frac]]] ["@" target ["_" js (#+ Literal Expression Statement)]]] ["." //// #_ @@ -35,24 +36,24 @@ (-> [(Parser s) (-> Text (Generator s))] Handler)) - (function (_ extension-name phase archive input) + (function (_ extension_name phase archive input) (case (.run parser input) (#try.Success input') - (handler extension-name phase archive input') + (handler extension_name phase archive input') (#try.Failure error) - (/////.throw extension.invalid-syntax [extension-name %synthesis input])))) + (/////.throw extension.invalid_syntax [extension_name %synthesis input])))) ## [Procedures] ## [[Bits]] (template [ ] [(def: ( [paramG subjectG]) (Binary Expression) - ( subjectG (//runtime.i64//to-number paramG)))] + ( subjectG (//runtime.i64//to_number paramG)))] - [i64//left-shift //runtime.i64//left-shift] - [i64//arithmetic-right-shift //runtime.i64//arithmetic-right-shift] - [i64//logical-right-shift //runtime.i64//logic-right-shift] + [i64//left_shift //runtime.i64//left_shift] + [i64//arithmetic_right_shift //runtime.i64//arithmetic_right_shift] + [i64//logical_right_shift //runtime.i64//logic_right_shift] ) ## [[Numbers]] @@ -66,7 +67,7 @@ (def: i64//char (Unary Expression) - (|>> //runtime.i64//to-number + (|>> //runtime.i64//to_number (list) (_.apply/* (_.var "String.fromCharCode")))) @@ -92,37 +93,37 @@ (def: (io//exit codeG) (Unary Expression) - (let [exit-node-js! (let [@@process (_.var "process")] - (|> (_.not (_.= _.undefined (_.type-of @@process))) + (let [exit_node_js! (let [@@process (_.var "process")] + (|> (_.not (_.= _.undefined (_.type_of @@process))) (_.and (_.the "exit" @@process)) - (_.and (_.do "exit" (list (//runtime.i64//to-number codeG)) @@process)))) - close-browser-window! (let [@@window (_.var "window")] - (|> (_.not (_.= _.undefined (_.type-of @@window))) + (_.and (_.do "exit" (list (//runtime.i64//to_number codeG)) @@process)))) + close_browser_window! (let [@@window (_.var "window")] + (|> (_.not (_.= _.undefined (_.type_of @@window))) (_.and (_.the "close" @@window)) (_.and (_.do "close" (list) @@window)))) - reload-page! (let [@@location (_.var "location")] - (|> (_.not (_.= _.undefined (_.type-of @@location))) + reload_page! (let [@@location (_.var "location")] + (|> (_.not (_.= _.undefined (_.type_of @@location))) (_.and (_.the "reload" @@location)) (_.and (_.do "reload" (list) @@location))))] - (|> exit-node-js! - (_.or close-browser-window!) - (_.or reload-page!)))) + (|> exit_node_js! + (_.or close_browser_window!) + (_.or reload_page!)))) -(def: (io//current-time _) +(def: (io//current_time _) (Nullary Expression) (|> (_.new (_.var "Date") (list)) (_.do "getTime" (list)) - //runtime.i64//from-number)) + //runtime.i64//from_number)) ## TODO: Get rid of this ASAP -(def: lux::syntax-char-case! +(def: lux::syntax_char_case! (..custom [($_ <>.and .any .any (<>.some (.tuple ($_ <>.and (.tuple (<>.many .i64)) .any)))) - (function (_ extension-name phase archive [input else conditionals]) + (function (_ extension_name phase archive [input else conditionals]) (do {! /////.monad} [inputG (phase archive input) elseG (phase archive else) @@ -135,29 +136,29 @@ (_.return branchG)]))) conditionals))] (wrap (_.apply/* (_.closure (list) - (_.switch (_.the //runtime.i64-low-field inputG) + (_.switch (_.the //runtime.i64_low_field inputG) conditionalsG (#.Some (_.return elseG)))) (list)))))])) ## [Bundles] -(def: lux-procs +(def: lux_procs Bundle (|> /.empty - (/.install "syntax char case!" lux::syntax-char-case!) + (/.install "syntax char case!" lux::syntax_char_case!) (/.install "is" (binary (product.uncurry _.=))) (/.install "try" (unary //runtime.lux//try)))) -(def: i64-procs +(def: i64_procs Bundle (<| (/.prefix "i64") (|> /.empty (/.install "and" (binary (product.uncurry //runtime.i64//and))) (/.install "or" (binary (product.uncurry //runtime.i64//or))) (/.install "xor" (binary (product.uncurry //runtime.i64//xor))) - (/.install "left-shift" (binary i64//left-shift)) - (/.install "logical-right-shift" (binary i64//logical-right-shift)) - (/.install "arithmetic-right-shift" (binary i64//arithmetic-right-shift)) + (/.install "left-shift" (binary i64//left_shift)) + (/.install "logical-right-shift" (binary i64//logical_right_shift)) + (/.install "arithmetic-right-shift" (binary i64//arithmetic_right_shift)) (/.install "=" (binary (product.uncurry //runtime.i64//=))) (/.install "<" (binary (product.uncurry //runtime.i64//<))) (/.install "+" (binary (product.uncurry //runtime.i64//+))) @@ -165,11 +166,11 @@ (/.install "*" (binary (product.uncurry //runtime.i64//*))) (/.install "/" (binary (product.uncurry //runtime.i64///))) (/.install "%" (binary (product.uncurry //runtime.i64//%))) - (/.install "f64" (unary //runtime.i64//to-number)) + (/.install "f64" (unary //runtime.i64//to_number)) (/.install "char" (unary i64//char)) ))) -(def: f64-procs +(def: f64_procs Bundle (<| (/.prefix "f64") (|> /.empty @@ -180,11 +181,11 @@ (/.install "%" (binary (product.uncurry _.%))) (/.install "=" (binary (product.uncurry _.=))) (/.install "<" (binary (product.uncurry _.<))) - (/.install "i64" (unary //runtime.i64//from-number)) + (/.install "i64" (unary //runtime.i64//from_number)) (/.install "encode" (unary (_.do "toString" (list)))) (/.install "decode" (unary f64//decode))))) -(def: text-procs +(def: text_procs Bundle (<| (/.prefix "text") (|> /.empty @@ -192,26 +193,26 @@ (/.install "<" (binary (product.uncurry _.<))) (/.install "concat" (binary text//concat)) (/.install "index" (trinary text//index)) - (/.install "size" (unary (|>> (_.the "length") //runtime.i64//from-number))) + (/.install "size" (unary (|>> (_.the "length") //runtime.i64//from_number))) (/.install "char" (binary (product.uncurry //runtime.text//char))) (/.install "clip" (trinary text//clip)) ))) -(def: io-procs +(def: io_procs Bundle (<| (/.prefix "io") (|> /.empty (/.install "log" (unary io//log)) (/.install "error" (unary //runtime.io//error)) (/.install "exit" (unary io//exit)) - (/.install "current-time" (nullary io//current-time))))) + (/.install "current-time" (nullary io//current_time))))) (def: #export bundle Bundle (<| (/.prefix "lux") - (|> lux-procs - (dictionary.merge i64-procs) - (dictionary.merge f64-procs) - (dictionary.merge text-procs) - (dictionary.merge io-procs) + (|> lux_procs + (dictionary.merge i64_procs) + (dictionary.merge f64_procs) + (dictionary.merge text_procs) + (dictionary.merge io_procs) ))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/host.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/host.lux index 0aeea4cd2..c81705f24 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/host.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/extension/generation/js/host.lux @@ -23,7 +23,7 @@ nullary unary binary trinary)] ["//" js #_ ["#." runtime (#+ Operation Phase Handler Bundle - with-vars)]]] + with_vars)]]] ["/#" // #_ ["." generation] ["//#" /// #_ @@ -31,15 +31,15 @@ (def: array::new (Unary Expression) - (|>> (_.the //runtime.i64-low-field) list (_.new (_.var "Array")))) + (|>> (_.the //runtime.i64_low_field) list (_.new (_.var "Array")))) (def: array::length (Unary Expression) - (|>> (_.the "length") //runtime.i64//from-number)) + (|>> (_.the "length") //runtime.i64//from_number)) (def: (array::read [indexG arrayG]) (Binary Expression) - (_.at (_.the //runtime.i64-low-field indexG) + (_.at (_.the //runtime.i64_low_field indexG) arrayG)) (def: (array::write [indexG valueG arrayG]) @@ -153,7 +153,7 @@ (|> /.empty (/.install "constant" js::constant) (/.install "apply" js::apply) - (/.install "type-of" (unary _.type-of)) + (/.install "type-of" (unary _.type_of)) (/.install "function" js::function) (dictionary.merge ..array) (dictionary.merge ..object) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/case.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/case.lux index 13038972b..3a828bbb9 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/case.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/case.lux @@ -7,10 +7,11 @@ [data ["." maybe] ["." text] - [number - ["n" nat]] [collection ["." list ("#\." functor fold)]]] + [math + [number + ["n" nat]]] [target ["_" js (#+ Expression Computation Var Statement)]]] ["." // #_ @@ -89,40 +90,40 @@ (def: @cursor (_.var "lux_pm_cursor")) (def: @temp (_.var "lux_pm_temp")) -(def: (push-cursor! value) +(def: (push_cursor! value) (-> Expression Statement) (_.statement (|> @cursor (_.do "push" (list value))))) -(def: peek-and-pop-cursor +(def: peek_and_pop_cursor Expression (|> @cursor (_.do "pop" (list)))) -(def: pop-cursor! +(def: pop_cursor! Statement - (_.statement ..peek-and-pop-cursor)) + (_.statement ..peek_and_pop_cursor)) (def: length (|>> (_.the "length"))) -(def: last-index +(def: last_index (|>> ..length (_.- (_.i32 +1)))) -(def: peek-cursor +(def: peek_cursor Expression - (|> @cursor (_.at (last-index @cursor)))) + (|> @cursor (_.at (last_index @cursor)))) -(def: save-cursor! +(def: save_cursor! Statement (.let [cursor (|> @cursor (_.do "slice" (list)))] (_.statement (|> @savepoint (_.do "push" (list cursor)))))) -(def: restore-cursor! +(def: restore_cursor! Statement (_.set @cursor (|> @savepoint (_.do "pop" (list))))) -(def: fail-pm! _.break) +(def: fail_pm! _.break) -(def: (multi-pop-cursor! pops) +(def: (multi_pop_cursor! pops) (-> Nat Statement) (.let [popsJS (_.i32 (.int pops))] (_.statement (|> @cursor (_.do "splice" (list (|> @cursor ..length (_.- popsJS)) @@ -132,30 +133,30 @@ [(def: ( simple? idx) (-> Bit Nat Statement) ($_ _.then - (_.set @temp (|> idx .int _.i32 (//runtime.sum//get ..peek-cursor ))) + (_.set @temp (|> idx .int _.i32 (//runtime.sum//get ..peek_cursor ))) (.if simple? (_.when (_.= _.null @temp) - ..fail-pm!) + ..fail_pm!) (_.if (_.= _.null @temp) - ..fail-pm! - (push-cursor! @temp)))))] + ..fail_pm! + (push_cursor! @temp)))))] - [left-choice _.null (<|)] - [right-choice (_.string "") inc] + [left_choice _.null (<|)] + [right_choice (_.string "") inc] ) (def: (alternation pre! post!) (-> Statement Statement Statement) ($_ _.then - (_.do-while (_.boolean false) + (_.do_while (_.boolean false) ($_ _.then - ..save-cursor! + ..save_cursor! pre!)) ($_ _.then - ..restore-cursor! + ..restore_cursor! post!))) -(def: (optimized-pattern-matching recur pathP) +(def: (optimized_pattern_matching recur pathP) (-> (-> Path (Operation Statement)) (-> Path (Operation (Maybe Statement)))) (.case pathP @@ -164,59 +165,59 @@ (|> nextP recur (\ ///////phase.monad map (|>> (_.then ( true idx)) #.Some)))]) - ([/////synthesis.simple-left-side ..left-choice] - [/////synthesis.simple-right-side ..right-choice]) + ([/////synthesis.simple_left_side ..left_choice] + [/////synthesis.simple_right_side ..right_choice]) (^ (/////synthesis.member/left 0)) - (///////phase\wrap (#.Some (push-cursor! (_.at (_.i32 +0) ..peek-cursor)))) + (///////phase\wrap (#.Some (push_cursor! (_.at (_.i32 +0) ..peek_cursor)))) ## Extra optimization (^ (/////synthesis.path/seq (/////synthesis.member/left 0) - (/////synthesis.!bind-top register thenP))) + (/////synthesis.!bind_top register thenP))) (do ///////phase.monad [then! (recur thenP)] (wrap (#.Some ($_ _.then - (_.define (..register register) (_.at (_.i32 +0) ..peek-cursor)) + (_.define (..register register) (_.at (_.i32 +0) ..peek_cursor)) then!)))) ## Extra optimization (^template [ ] [(^ (/////synthesis.path/seq ( lefts) - (/////synthesis.!bind-top register thenP))) + (/////synthesis.!bind_top register thenP))) (do ///////phase.monad [then! (recur thenP)] (wrap (#.Some ($_ _.then - (_.define (..register register) ( (_.i32 (.int lefts)) ..peek-cursor)) + (_.define (..register register) ( (_.i32 (.int lefts)) ..peek_cursor)) then!))))]) ([/////synthesis.member/left //runtime.tuple//left] [/////synthesis.member/right //runtime.tuple//right]) - (^ (/////synthesis.!bind-top register thenP)) + (^ (/////synthesis.!bind_top register thenP)) (do ///////phase.monad [then! (recur thenP)] (wrap (#.Some ($_ _.then - (_.define (..register register) ..peek-and-pop-cursor) + (_.define (..register register) ..peek_and_pop_cursor) then!)))) - (^ (/////synthesis.!multi-pop nextP)) - (.let [[extra-pops nextP'] (////synthesis/case.count-pops nextP)] + (^ (/////synthesis.!multi_pop nextP)) + (.let [[extra_pops nextP'] (////synthesis/case.count_pops nextP)] (do ///////phase.monad [next! (recur nextP')] (wrap (#.Some ($_ _.then - (multi-pop-cursor! (n.+ 2 extra-pops)) + (multi_pop_cursor! (n.+ 2 extra_pops)) next!))))) _ (///////phase\wrap #.None))) -(def: (pattern-matching' statement expression archive) +(def: (pattern_matching' statement expression archive) (-> Phase! Phase Archive (-> Path (Operation Statement))) (function (recur pathP) (do ///////phase.monad - [outcome (optimized-pattern-matching recur pathP)] + [outcome (optimized_pattern_matching recur pathP)] (.case outcome (#.Some outcome) (wrap outcome) @@ -224,12 +225,12 @@ #.None (.case pathP #/////synthesis.Pop - (///////phase\wrap pop-cursor!) + (///////phase\wrap pop_cursor!) (#/////synthesis.Bind register) - (///////phase\wrap (_.define (..register register) ..peek-cursor)) + (///////phase\wrap (_.define (..register register) ..peek_cursor)) - (#/////synthesis.Bit-Fork when thenP elseP) + (#/////synthesis.Bit_Fork when thenP elseP) (do {! ///////phase.monad} [then! (recur thenP) else! (.case elseP @@ -237,25 +238,25 @@ (recur elseP) #.None - (wrap ..fail-pm!))] + (wrap ..fail_pm!))] (wrap (.if when - (_.if ..peek-cursor + (_.if ..peek_cursor then! else!) - (_.if ..peek-cursor + (_.if ..peek_cursor else! then!)))) - (#/////synthesis.I64-Fork cons) + (#/////synthesis.I64_Fork cons) (do {! ///////phase.monad} [clauses (monad.map ! (function (_ [match then]) (do ! [then! (recur then)] (wrap [(//runtime.i64//= (//primitive.i64 (.int match)) - ..peek-cursor) + ..peek_cursor) then!]))) (#.Cons cons))] - (wrap (_.cond clauses ..fail-pm!))) + (wrap (_.cond clauses ..fail_pm!))) (^template [ ] [( cons) @@ -263,11 +264,11 @@ [cases (monad.map ! (function (_ [match then]) (\ ! map (|>> [(list ( match))]) (recur then))) (#.Cons cons))] - (wrap (_.switch ..peek-cursor + (wrap (_.switch ..peek_cursor cases - (#.Some ..fail-pm!))))]) - ([#/////synthesis.F64-Fork //primitive.f64 Frac] - [#/////synthesis.Text-Fork //primitive.text Text]) + (#.Some ..fail_pm!))))]) + ([#/////synthesis.F64_Fork //primitive.f64 Frac] + [#/////synthesis.Text_Fork //primitive.text Text]) (#/////synthesis.Then bodyS) (statement expression archive bodyS) @@ -275,12 +276,12 @@ (^template [ ] [(^ ( idx)) (///////phase\wrap ( false idx))]) - ([/////synthesis.side/left ..left-choice] - [/////synthesis.side/right ..right-choice]) + ([/////synthesis.side/left ..left_choice] + [/////synthesis.side/right ..right_choice]) (^template [ ] [(^ ( lefts)) - (///////phase\wrap (push-cursor! ( (_.i32 (.int lefts)) ..peek-cursor)))]) + (///////phase\wrap (push_cursor! ( (_.i32 (.int lefts)) ..peek_cursor)))]) ([/////synthesis.member/left //runtime.tuple//left] [/////synthesis.member/right //runtime.tuple//right]) @@ -293,24 +294,24 @@ ([/////synthesis.path/seq _.then] [/////synthesis.path/alt ..alternation])))))) -(def: (pattern-matching statement expression archive pathP) +(def: (pattern_matching statement expression archive pathP) (-> Phase! Phase Archive Path (Operation Statement)) (do ///////phase.monad - [pattern-matching! (pattern-matching' statement expression archive pathP)] + [pattern_matching! (pattern_matching' statement expression archive pathP)] (wrap ($_ _.then - (_.do-while (_.boolean false) - pattern-matching!) - (_.throw (_.string ////synthesis/case.pattern-matching-error)))))) + (_.do_while (_.boolean false) + pattern_matching!) + (_.throw (_.string ////synthesis/case.pattern_matching_error)))))) (def: #export (case statement expression archive [valueS pathP]) (-> Phase! (Generator [Synthesis Path])) (do ///////phase.monad - [stack-init (expression archive valueS) - path! (pattern-matching statement expression archive pathP) + [stack_init (expression archive valueS) + path! (pattern_matching statement expression archive pathP) #let [closure (<| (_.closure (list)) ($_ _.then (_.declare @temp) - (_.define @cursor (_.array (list stack-init))) + (_.define @cursor (_.array (list stack_init))) (_.define @savepoint (_.array (list))) path!))]] (wrap (_.apply/* closure (list))))) @@ -318,10 +319,10 @@ (def: #export (case! statement expression archive [valueS pathP]) (Generator! [Synthesis Path]) (do ///////phase.monad - [stack-init (expression archive valueS) - path! (pattern-matching statement expression archive pathP)] + [stack_init (expression archive valueS) + path! (pattern_matching statement expression archive pathP)] (wrap ($_ _.then (_.declare @temp) - (_.define @cursor (_.array (list stack-init))) + (_.define @cursor (_.array (list stack_init))) (_.define @savepoint (_.array (list))) path!)))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/function.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/function.lux index c939b36a6..0d47e9fe8 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/function.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/function.lux @@ -35,11 +35,11 @@ argsO+ (monad.map ! (generate archive) argsS+)] (wrap (_.apply/* functionO argsO+)))) -(def: (with-closure @self inits function-body) +(def: (with_closure @self inits function_body) (-> Var (List Expression) Statement [Statement Expression]) (case inits #.Nil - [(_.function! @self (list) function-body) + [(_.function! @self (list) function_body) @self] _ @@ -48,7 +48,7 @@ [(_.function! @self (|> (list.enumeration inits) (list\map (|>> product.left capture))) - (_.return (_.function @self (list) function-body))) + (_.return (_.function @self (list) function_body))) (_.apply/* @self inits)]))) (def: @curried (_.var "curried")) @@ -58,63 +58,63 @@ (def: @@arguments (_.var "arguments")) -(def: (@scope function-name) +(def: (@scope function_name) (-> Context Text) - (format (///reference.artifact function-name) "_scope")) + (format (///reference.artifact function_name) "_scope")) (def: #export (function statement expression archive [environment arity bodyS]) (-> Phase! (Generator (Abstraction Synthesis))) (do {! ///////phase.monad} - [[function-name body!] (/////generation.with-new-context archive + [[function_name body!] (/////generation.with_new_context archive (do ! [scope (\ ! map ..@scope (/////generation.context archive))] - (/////generation.with-anchor [1 scope] + (/////generation.with_anchor [1 scope] (statement expression archive bodyS)))) #let [arityO (|> arity .int _.i32) - @num-args (_.var "num_args") - @scope (..@scope function-name) - @self (_.var (///reference.artifact function-name)) - apply-poly (.function (_ args func) + @num_args (_.var "num_args") + @scope (..@scope function_name) + @self (_.var (///reference.artifact function_name)) + apply_poly (.function (_ args func) (|> func (_.do "apply" (list _.null args)))) - initialize-self! (_.define (//case.register 0) @self) + initialize_self! (_.define (//case.register 0) @self) initialize! (list\fold (.function (_ post pre!) ($_ _.then pre! (_.define (..input post) (_.at (_.i32 (.int post)) @@arguments)))) - initialize-self! + initialize_self! (list.indices arity))] environment (monad.map ! (expression archive) environment) - #let [[definition instantiation] (with-closure @self environment + #let [[definition instantiation] (with_closure @self environment ($_ _.then - (_.define @num-args (_.the "length" @@arguments)) - (_.cond (list [(|> @num-args (_.= arityO)) + (_.define @num_args (_.the "length" @@arguments)) + (_.cond (list [(|> @num_args (_.= arityO)) ($_ _.then initialize! - (_.with-label (_.label @scope) - (_.do-while (_.boolean true) + (_.with_label (_.label @scope) + (_.do_while (_.boolean true) body!)))] - [(|> @num-args (_.> arityO)) - (let [arity-inputs (|> (_.array (list)) + [(|> @num_args (_.> arityO)) + (let [arity_inputs (|> (_.array (list)) (_.the "slice") (_.do "call" (list @@arguments (_.i32 +0) arityO))) - extra-inputs (|> (_.array (list)) + extra_inputs (|> (_.array (list)) (_.the "slice") (_.do "call" (list @@arguments arityO)))] (_.return (|> @self - (apply-poly arity-inputs) - (apply-poly extra-inputs))))]) - ## (|> @num-args (_.< arityO)) - (let [all-inputs (|> (_.array (list)) + (apply_poly arity_inputs) + (apply_poly extra_inputs))))]) + ## (|> @num_args (_.< arityO)) + (let [all_inputs (|> (_.array (list)) (_.the "slice") (_.do "call" (list @@arguments)))] ($_ _.then - (_.define @curried all-inputs) + (_.define @curried all_inputs) (_.return (_.closure (list) - (let [@missing all-inputs] - (_.return (apply-poly (_.do "concat" (list @missing) @curried) + (let [@missing all_inputs] + (_.return (apply_poly (_.do "concat" (list @missing) @curried) @self)))))))) ))] _ (/////generation.execute! definition) - _ (/////generation.save! (%.nat (product.right function-name)) definition)] + _ (/////generation.save! (%.nat (product.right function_name)) definition)] (wrap instantiation))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/loop.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/loop.lux index 29cdc1180..bbeaca725 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/loop.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/loop.lux @@ -6,10 +6,11 @@ ["." product] ["." text ["%" format (#+ format)]] - [number - ["n" nat]] [collection ["." list ("#\." functor fold)]]] + [math + [number + ["n" nat]]] [target ["_" js (#+ Computation Var Expression Statement)]]] ["." // #_ @@ -51,11 +52,11 @@ (do {! ///////phase.monad} [@scope (\ ! map ..@scope /////generation.next) initsO+ (monad.map ! (expression archive) initsS+) - body! (/////generation.with-anchor [start @scope] + body! (/////generation.with_anchor [start @scope] (statement expression archive bodyS))] (wrap (..setup true start initsO+ - (_.with-label (_.label @scope) - (_.do-while (_.boolean true) + (_.with_label (_.label @scope) + (_.do_while (_.boolean true) body!))))))) (def: #export (scope statement expression archive [start initsS+ bodyS]) @@ -70,14 +71,14 @@ (do {! ///////phase.monad} [@scope (\ ! map ..@scope /////generation.next) initsO+ (monad.map ! (expression archive) initsS+) - body! (/////generation.with-anchor [start @scope] + body! (/////generation.with_anchor [start @scope] (statement expression archive bodyS)) #let [closure (_.closure (|> initsS+ list.enumeration (list\map (|>> product.left (n.+ start) //case.register))) - (_.with-label (_.label @scope) - (_.do-while (_.boolean true) + (_.with_label (_.label @scope) + (_.do_while (_.boolean true) body!)))]] (wrap (_.apply/* closure initsO+))))) @@ -95,4 +96,4 @@ list.enumeration (list\map (function (_ [idx _]) (_.at (_.i32 (.int idx)) @temp)))) - (_.continue-at (_.label @scope))))))) + (_.continue_at (_.label @scope))))))) diff --git a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux index d8859f767..119796a73 100644 --- a/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux +++ b/stdlib/source/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux @@ -1,5 +1,6 @@ (.module: [lux #* + ["." meta] [abstract ["." monad (#+ do)]] [control @@ -8,17 +9,18 @@ ["s" code]]] [data ["." product] - [number (#+ hex) - ["." i64]] ["." text ("#\." hash) ["%" format (#+ format)] ["." encoding]] [collection ["." list ("#\." functor)] ["." row]]] - ["." macro - ["." code] - [syntax (#+ syntax:)]] + [macro + [syntax (#+ syntax:)] + ["." code]] + [math + [number (#+ hex) + ["." i64]]] [target ["_" js (#+ Expression Var Computation Statement)]] [tool @@ -64,11 +66,11 @@ (def: #export high (-> (I64 Any) (I64 Any)) - (i64.logic-right-shift 32)) + (i64.logic_right_shift 32)) (def: #export low (-> (I64 Any) (I64 Any)) - (let [mask (dec (i64.left-shift 32 1))] + (let [mask (dec (i64.left_shift 32 1))] (|>> (i64.and mask)))) (def: #export unit Computation (_.string /////synthesis.unit)) @@ -83,67 +85,67 @@ (-> Var (-> Var Expression) Statement) (_.define name (definition name))) -(syntax: #export (with-vars {vars (s.tuple (p.some s.local-identifier))} +(syntax: #export (with_vars {vars (s.tuple (p.some s.local_identifier))} body) - (do {! macro.monad} - [ids (monad.seq ! (list.repeat (list.size vars) macro.count))] + (do {! meta.monad} + [ids (monad.seq ! (list.repeat (list.size vars) meta.count))] (wrap (list (` (let [(~+ (|> vars (list.zip/2 ids) (list\map (function (_ [id var]) - (list (code.local-identifier var) + (list (code.local_identifier var) (` (_.var (~ (code.text (format "v" (%.nat id))))))))) list.concat))] (~ body))))))) -(def: (runtime-name name) +(def: (runtime_name name) (-> Text [Code Code]) (let [identifier (format ..prefix "_" (%.nat $.version) "_" (%.nat (text\hash name)))] [(` (_.var (~ (code.text identifier)))) - (code.local-identifier identifier)])) + (code.local_identifier identifier)])) -(syntax: (runtime: {declaration (p.or s.local-identifier - (s.form (p.and s.local-identifier - (p.some s.local-identifier))))} +(syntax: (runtime: {declaration (p.or s.local_identifier + (s.form (p.and s.local_identifier + (p.some s.local_identifier))))} code) (case declaration (#.Left name) - (macro.with-gensyms [g!_] - (let [[runtime-nameC runtime-nameC!] (..runtime-name name) - nameC (code.local-identifier name)] - (wrap (list (` (def: (~ runtime-nameC!) + (meta.with_gensyms [g!_] + (let [[runtime_nameC runtime_nameC!] (..runtime_name name) + nameC (code.local_identifier name)] + (wrap (list (` (def: (~ runtime_nameC!) Var - (~ runtime-nameC))) + (~ runtime_nameC))) (` (def: #export (~ nameC) - (~ runtime-nameC!))) + (~ runtime_nameC!))) - (` (def: (~ (code.local-identifier (format "@" name))) + (` (def: (~ (code.local_identifier (format "@" name))) Statement - (..feature (~ runtime-nameC) + (..feature (~ runtime_nameC) (function ((~ g!_) (~ nameC)) (~ code))))))))) (#.Right [name inputs]) - (macro.with-gensyms [g!_] - (let [[runtime-nameC runtime-nameC!] (..runtime-name name) - nameC (code.local-identifier name) - code-nameC (code.local-identifier (format "@" name)) - inputsC (list\map code.local-identifier inputs) - inputs-typesC (list\map (function.constant (` _.Expression)) inputs)] - (wrap (list (` (def: ((~ runtime-nameC!) (~+ inputsC)) - (-> (~+ inputs-typesC) Computation) - (_.apply/* (~ runtime-nameC) (list (~+ inputsC))))) + (meta.with_gensyms [g!_] + (let [[runtime_nameC runtime_nameC!] (..runtime_name name) + nameC (code.local_identifier name) + code_nameC (code.local_identifier (format "@" name)) + inputsC (list\map code.local_identifier inputs) + inputs_typesC (list\map (function.constant (` _.Expression)) inputs)] + (wrap (list (` (def: ((~ runtime_nameC!) (~+ inputsC)) + (-> (~+ inputs_typesC) Computation) + (_.apply/* (~ runtime_nameC) (list (~+ inputsC))))) (` (def: #export (~ nameC) - (~ runtime-nameC!))) + (~ runtime_nameC!))) - (` (def: (~ (code.local-identifier (format "@" name))) + (` (def: (~ (code.local_identifier (format "@" name))) Statement - (..feature (~ runtime-nameC) + (..feature (~ runtime_nameC) (function ((~ g!_) (~ g!_)) - (..with-vars [(~+ inputsC)] + (..with_vars [(~+ inputsC)] (_.function (~ g!_) (list (~+ inputsC)) (~ code))))))))))))) @@ -151,80 +153,80 @@ (-> Expression Computation) (_.the "length")) -(def: last-index +(def: last_index (-> Expression Computation) (|>> ..length (_.- (_.i32 +1)))) -(def: (last-element tuple) - (_.at (..last-index tuple) +(def: (last_element tuple) + (_.at (..last_index tuple) tuple)) -(with-expansions [ (as-is ($_ _.then - (_.set lefts (_.- last-index-right lefts)) - (_.set tuple (_.at last-index-right tuple))))] +(with_expansions [ (as_is ($_ _.then + (_.set lefts (_.- last_index_right lefts)) + (_.set tuple (_.at last_index_right tuple))))] (runtime: (tuple//left lefts tuple) - (with-vars [last-index-right] + (with_vars [last_index_right] (<| (_.while (_.boolean true)) ($_ _.then - (_.define last-index-right (..last-index tuple)) - (_.if (_.> lefts last-index-right) + (_.define last_index_right (..last_index tuple)) + (_.if (_.> lefts last_index_right) ## No need for recursion (_.return (_.at lefts tuple)) ## Needs recursion ))))) (runtime: (tuple//right lefts tuple) - (with-vars [last-index-right right-index] + (with_vars [last_index_right right_index] (<| (_.while (_.boolean true)) ($_ _.then - (_.define last-index-right (..last-index tuple)) - (_.define right-index (_.+ (_.i32 +1) lefts)) - (_.cond (list [(_.= last-index-right right-index) - (_.return (_.at right-index tuple))] - [(_.> last-index-right right-index) + (_.define last_index_right (..last_index tuple)) + (_.define right_index (_.+ (_.i32 +1) lefts)) + (_.cond (list [(_.= last_index_right right_index) + (_.return (_.at right_index tuple))] + [(_.> last_index_right right_index) ## Needs recursion. ]) - (_.return (_.do "slice" (list right-index) tuple))) + (_.return (_.do "slice" (list right_index) tuple))) ))))) -(def: #export variant-tag-field "_lux_tag") -(def: #export variant-flag-field "_lux_flag") -(def: #export variant-value-field "_lux_value") +(def: #export variant_tag_field "_lux_tag") +(def: #export variant_flag_field "_lux_flag") +(def: #export variant_value_field "_lux_value") (runtime: (variant//create tag last? value) - (_.return (_.object (list [..variant-tag-field tag] - [..variant-flag-field last?] - [..variant-value-field value])))) + (_.return (_.object (list [..variant_tag_field tag] + [..variant_flag_field last?] + [..variant_value_field value])))) (def: #export (variant tag last? value) (-> Expression Expression Expression Computation) (..variant//create tag last? value)) -(runtime: (sum//get sum wants-last wanted-tag) - (let [no-match! (_.return _.null) - sum-tag (|> sum (_.the ..variant-tag-field)) - sum-flag (|> sum (_.the ..variant-flag-field)) - sum-value (|> sum (_.the ..variant-value-field)) - is-last? (_.= ..unit sum-flag) - extact-match! (_.return sum-value) - test-recursion! (_.if is-last? +(runtime: (sum//get sum wants_last wanted_tag) + (let [no_match! (_.return _.null) + sum_tag (|> sum (_.the ..variant_tag_field)) + sum_flag (|> sum (_.the ..variant_flag_field)) + sum_value (|> sum (_.the ..variant_value_field)) + is_last? (_.= ..unit sum_flag) + extact_match! (_.return sum_value) + test_recursion! (_.if is_last? ## Must recurse. ($_ _.then - (_.set wanted-tag (_.- sum-tag wanted-tag)) - (_.set sum sum-value)) - no-match!) - extrac-sub-variant! (_.return (..variant (_.- wanted-tag sum-tag) sum-flag sum-value))] + (_.set wanted_tag (_.- sum_tag wanted_tag)) + (_.set sum sum_value)) + no_match!) + extrac_sub_variant! (_.return (..variant (_.- wanted_tag sum_tag) sum_flag sum_value))] (<| (_.while (_.boolean true)) - (_.cond (list [(_.= wanted-tag sum-tag) - (_.if (_.= wants-last sum-flag) - extact-match! - test-recursion!)] - [(_.< wanted-tag sum-tag) - test-recursion!] - [(_.and (_.> wanted-tag sum-tag) - (_.= ..unit wants-last)) - extrac-sub-variant!]) - no-match!)))) + (_.cond (list [(_.= wanted_tag sum_tag) + (_.if (_.= wants_last sum_flag) + extact_match! + test_recursion!)] + [(_.< wanted_tag sum_tag) + test_recursion!] + [(_.and (_.> wanted_tag sum_tag) + (_.= ..unit wants_last)) + extrac_sub_variant!]) + no_match!)))) (def: none Computation @@ -252,16 +254,16 @@ )) (runtime: (lux//try op) - (with-vars [ex] + (with_vars [ex] (_.try (_.return (..right (_.apply/1 op ..unit))) [ex (_.return (..left (|> ex (_.do "toString" (list)))))]))) -(runtime: (lux//program-args inputs) - (with-vars [output idx] +(runtime: (lux//program_args inputs) + (with_vars [output idx] ($_ _.then (_.define output ..none) (_.for idx - (..last-index inputs) + (..last_index inputs) (_.>= (_.i32 +0) idx) (_.-- idx) (_.set output (..some (_.array (list (_.at idx inputs) @@ -272,18 +274,18 @@ Statement ($_ _.then @lux//try - @lux//program-args + @lux//program_args )) -(def: #export i64-low-field Text "_lux_low") -(def: #export i64-high-field Text "_lux_high") +(def: #export i64_low_field Text "_lux_low") +(def: #export i64_high_field Text "_lux_high") (runtime: (i64//new high low) - (_.return (_.object (list [..i64-high-field high] - [..i64-low-field low])))) + (_.return (_.object (list [..i64_high_field high] + [..i64_low_field low])))) (runtime: i64//2^16 - (_.left-shift (_.i32 +16) (_.i32 +1))) + (_.left_shift (_.i32 +16) (_.i32 +1))) (runtime: i64//2^32 (_.* i64//2^16 i64//2^16)) @@ -294,14 +296,14 @@ (runtime: i64//2^63 (|> i64//2^64 (_./ (_.i32 +2)))) -(runtime: (i64//unsigned-low i64) - (_.return (_.? (|> i64 (_.the ..i64-low-field) (_.>= (_.i32 +0))) - (|> i64 (_.the ..i64-low-field)) - (|> i64 (_.the ..i64-low-field) (_.+ i64//2^32))))) +(runtime: (i64//unsigned_low i64) + (_.return (_.? (|> i64 (_.the ..i64_low_field) (_.>= (_.i32 +0))) + (|> i64 (_.the ..i64_low_field)) + (|> i64 (_.the ..i64_low_field) (_.+ i64//2^32))))) -(runtime: (i64//to-number i64) - (_.return (|> i64 (_.the ..i64-high-field) (_.* i64//2^32) - (_.+ (i64//unsigned-low i64))))) +(runtime: (i64//to_number i64) + (_.return (|> i64 (_.the ..i64_high_field) (_.* i64//2^32) + (_.+ (i64//unsigned_low i64))))) (runtime: i64//zero (i64//new (_.i32 +0) (_.i32 +0))) @@ -316,20 +318,20 @@ (i64//new (_.i32 +0) (_.i32 +1))) (runtime: (i64//= reference sample) - (_.return (_.and (_.= (_.the ..i64-high-field reference) - (_.the ..i64-high-field sample)) - (_.= (_.the ..i64-low-field reference) - (_.the ..i64-low-field sample))))) + (_.return (_.and (_.= (_.the ..i64_high_field reference) + (_.the ..i64_high_field sample)) + (_.= (_.the ..i64_low_field reference) + (_.the ..i64_low_field sample))))) (runtime: (i64//+ parameter subject) - (let [up-16 (_.left-shift (_.i32 +16)) - high-16 (_.logic-right-shift (_.i32 +16)) - low-16 (_.bit-and (_.i32 (hex "+FFFF"))) - hh (|>> (_.the ..i64-high-field) high-16) - hl (|>> (_.the ..i64-high-field) low-16) - lh (|>> (_.the ..i64-low-field) high-16) - ll (|>> (_.the ..i64-low-field) low-16)] - (with-vars [l48 l32 l16 l00 + (let [up_16 (_.left_shift (_.i32 +16)) + high_16 (_.logic_right_shift (_.i32 +16)) + low_16 (_.bit_and (_.i32 (hex "+FFFF"))) + hh (|>> (_.the ..i64_high_field) high_16) + hl (|>> (_.the ..i64_high_field) low_16) + lh (|>> (_.the ..i64_low_field) high_16) + ll (|>> (_.the ..i64_low_field) low_16)] + (with_vars [l48 l32 l16 l00 r48 r32 r16 r00 x48 x32 x16 x00] ($_ _.then @@ -344,34 +346,34 @@ (_.define r00 (ll parameter)) (_.define x00 (_.+ l00 r00)) - (_.define x16 (high-16 x00)) - (_.set x00 (low-16 x00)) + (_.define x16 (high_16 x00)) + (_.set x00 (low_16 x00)) (_.set x16 (|> x16 (_.+ l16) (_.+ r16))) - (_.define x32 (high-16 x16)) - (_.set x16 (low-16 x16)) + (_.define x32 (high_16 x16)) + (_.set x16 (low_16 x16)) (_.set x32 (|> x32 (_.+ l32) (_.+ r32))) - (_.define x48 (|> (high-16 x32) (_.+ l48) (_.+ r48) low-16)) - (_.set x32 (low-16 x32)) + (_.define x48 (|> (high_16 x32) (_.+ l48) (_.+ r48) low_16)) + (_.set x32 (low_16 x32)) - (_.return (i64//new (_.bit-or (up-16 x48) x32) - (_.bit-or (up-16 x16) x00))) + (_.return (i64//new (_.bit_or (up_16 x48) x32) + (_.bit_or (up_16 x16) x00))) )))) (template [ ] [(runtime: ( subject parameter) - (_.return (i64//new ( (_.the ..i64-high-field subject) - (_.the ..i64-high-field parameter)) - ( (_.the ..i64-low-field subject) - (_.the ..i64-low-field parameter)))))] - - [i64//xor _.bit-xor] - [i64//or _.bit-or] - [i64//and _.bit-and] + (_.return (i64//new ( (_.the ..i64_high_field subject) + (_.the ..i64_high_field parameter)) + ( (_.the ..i64_low_field subject) + (_.the ..i64_low_field parameter)))))] + + [i64//xor _.bit_xor] + [i64//or _.bit_or] + [i64//and _.bit_and] ) (runtime: (i64//not value) - (_.return (i64//new (_.bit-not (_.the ..i64-high-field value)) - (_.bit-not (_.the ..i64-low-field value))))) + (_.return (i64//new (_.bit_not (_.the ..i64_high_field value)) + (_.bit_not (_.the ..i64_low_field value))))) (runtime: (i64//negate value) (_.if (i64//= i64//min value) @@ -381,71 +383,71 @@ (runtime: i64//-one (i64//negate i64//one)) -(runtime: (i64//from-number value) - (_.cond (list [(_.not-a-number? value) +(runtime: (i64//from_number value) + (_.cond (list [(_.not_a_number? value) (_.return i64//zero)] [(_.<= (_.negate i64//2^63) value) (_.return i64//min)] [(|> value (_.+ (_.i32 +1)) (_.>= i64//2^63)) (_.return i64//max)] [(|> value (_.< (_.i32 +0))) - (_.return (|> value _.negate i64//from-number i64//negate))]) - (_.return (i64//new (|> value (_./ i64//2^32) _.to-i32) - (|> value (_.% i64//2^32) _.to-i32))))) + (_.return (|> value _.negate i64//from_number i64//negate))]) + (_.return (i64//new (|> value (_./ i64//2^32) _.to_i32) + (|> value (_.% i64//2^32) _.to_i32))))) -(def: (cap-shift! shift) +(def: (cap_shift! shift) (-> Var Statement) - (_.set shift (|> shift (_.bit-and (_.i32 +63))))) + (_.set shift (|> shift (_.bit_and (_.i32 +63))))) -(def: (no-shift! shift input) +(def: (no_shift! shift input) (-> Var Var [Expression Statement]) [(|> shift (_.= (_.i32 +0))) (_.return input)]) -(def: small-shift? +(def: small_shift? (-> Var Expression) (|>> (_.< (_.i32 +32)))) -(runtime: (i64//left-shift input shift) +(runtime: (i64//left_shift input shift) ($_ _.then - (..cap-shift! shift) - (_.cond (list (..no-shift! shift input) - [(..small-shift? shift) - (let [high (_.bit-or (|> input (_.the ..i64-high-field) (_.left-shift shift)) - (|> input (_.the ..i64-low-field) (_.logic-right-shift (_.- shift (_.i32 +32))))) - low (|> input (_.the ..i64-low-field) (_.left-shift shift))] + (..cap_shift! shift) + (_.cond (list (..no_shift! shift input) + [(..small_shift? shift) + (let [high (_.bit_or (|> input (_.the ..i64_high_field) (_.left_shift shift)) + (|> input (_.the ..i64_low_field) (_.logic_right_shift (_.- shift (_.i32 +32))))) + low (|> input (_.the ..i64_low_field) (_.left_shift shift))] (_.return (i64//new high low)))]) - (let [high (|> input (_.the ..i64-low-field) (_.left-shift (_.- (_.i32 +32) shift)))] + (let [high (|> input (_.the ..i64_low_field) (_.left_shift (_.- (_.i32 +32) shift)))] (_.return (i64//new high (_.i32 +0))))))) -(runtime: (i64//arithmetic-right-shift input shift) +(runtime: (i64//arithmetic_right_shift input shift) ($_ _.then - (..cap-shift! shift) - (_.cond (list (..no-shift! shift input) - [(..small-shift? shift) - (let [high (|> input (_.the ..i64-high-field) (_.arithmetic-right-shift shift)) - low (|> input (_.the ..i64-low-field) (_.logic-right-shift shift) - (_.bit-or (|> input (_.the ..i64-high-field) (_.left-shift (_.- shift (_.i32 +32))))))] + (..cap_shift! shift) + (_.cond (list (..no_shift! shift input) + [(..small_shift? shift) + (let [high (|> input (_.the ..i64_high_field) (_.arithmetic_right_shift shift)) + low (|> input (_.the ..i64_low_field) (_.logic_right_shift shift) + (_.bit_or (|> input (_.the ..i64_high_field) (_.left_shift (_.- shift (_.i32 +32))))))] (_.return (i64//new high low)))]) - (let [high (_.? (|> input (_.the ..i64-high-field) (_.>= (_.i32 +0))) + (let [high (_.? (|> input (_.the ..i64_high_field) (_.>= (_.i32 +0))) (_.i32 +0) (_.i32 -1)) - low (|> input (_.the ..i64-high-field) (_.arithmetic-right-shift (_.- (_.i32 +32) shift)))] + low (|> input (_.the ..i64_high_field) (_.arithmetic_right_shift (_.- (_.i32 +32) shift)))] (_.return (i64//new high low)))))) -(runtime: (i64//logic-right-shift input shift) +(runtime: (i64//logic_right_shift input shift) ($_ _.then - (..cap-shift! shift) - (_.cond (list (..no-shift! shift input) - [(..small-shift? shift) - (let [high (|> input (_.the ..i64-high-field) (_.logic-right-shift shift)) - low (|> input (_.the ..i64-low-field) (_.logic-right-shift shift) - (_.bit-or (|> input (_.the ..i64-high-field) (_.left-shift (_.- shift (_.i32 +32))))))] + (..cap_shift! shift) + (_.cond (list (..no_shift! shift input) + [(..small_shift? shift) + (let [high (|> input (_.the ..i64_high_field) (_.logic_right_shift shift)) + low (|> input (_.the ..i64_low_field) (_.logic_right_shift shift) + (_.bit_or (|> input (_.the ..i64_high_field) (_.left_shift (_.- shift (_.i32 +32))))))] (_.return (i64//new high low)))] [(|> shift (_.= (_.i32 +32))) - (_.return (i64//new (_.i32 +0) (|> input (_.the ..i64-high-field))))]) + (_.return (i64//new (_.i32 +0) (|> input (_.the ..i64_high_field))))]) (_.return (i64//new (_.i32 +0) - (|> input (_.the ..i64-high-field) (_.logic-right-shift (_.- (_.i32 +32) shift)))))))) + (|> input (_.the ..i64_high_field) (_.logic_right_shift (_.- (_.i32 +32) shift)))))))) (def: runtime//bit Statement @@ -454,16 +456,16 @@ @i64//or @i64//xor @i64//not - @i64//left-shift - @i64//arithmetic-right-shift - @i64//logic-right-shift + @i64//left_shift + @i64//arithmetic_right_shift + @i64//logic_right_shift )) (runtime: (i64//- parameter subject) (_.return (i64//+ (i64//negate parameter) subject))) (runtime: (i64//* parameter subject) - (let [negative? (|>> (_.the ..i64-high-field) (_.< (_.i32 +0)))] + (let [negative? (|>> (_.the ..i64_high_field) (_.< (_.i32 +0)))] (_.cond (list [(negative? subject) (_.if (negative? parameter) ## Both are negative @@ -474,14 +476,14 @@ ## Parameter is negative (_.return (i64//negate (i64//* (i64//negate parameter) subject)))]) ## Both are positive - (let [up-16 (_.left-shift (_.i32 +16)) - high-16 (_.logic-right-shift (_.i32 +16)) - low-16 (_.bit-and (_.i32 (hex "+FFFF"))) - hh (|>> (_.the ..i64-high-field) high-16) - hl (|>> (_.the ..i64-high-field) low-16) - lh (|>> (_.the ..i64-low-field) high-16) - ll (|>> (_.the ..i64-low-field) low-16)] - (with-vars [l48 l32 l16 l00 + (let [up_16 (_.left_shift (_.i32 +16)) + high_16 (_.logic_right_shift (_.i32 +16)) + low_16 (_.bit_and (_.i32 (hex "+FFFF"))) + hh (|>> (_.the ..i64_high_field) high_16) + hl (|>> (_.the ..i64_high_field) low_16) + lh (|>> (_.the ..i64_low_field) high_16) + ll (|>> (_.the ..i64_low_field) low_16)] + (with_vars [l48 l32 l16 l00 r48 r32 r16 r00 x48 x32 x16 x00] ($_ _.then @@ -496,35 +498,35 @@ (_.define r00 (ll parameter)) (_.define x00 (_.* l00 r00)) - (_.define x16 (high-16 x00)) - (_.set x00 (low-16 x00)) + (_.define x16 (high_16 x00)) + (_.set x00 (low_16 x00)) (_.set x16 (|> x16 (_.+ (_.* l16 r00)))) - (_.define x32 (high-16 x16)) (_.set x16 (low-16 x16)) + (_.define x32 (high_16 x16)) (_.set x16 (low_16 x16)) (_.set x16 (|> x16 (_.+ (_.* l00 r16)))) - (_.set x32 (|> x32 (_.+ (high-16 x16)))) (_.set x16 (low-16 x16)) + (_.set x32 (|> x32 (_.+ (high_16 x16)))) (_.set x16 (low_16 x16)) (_.set x32 (|> x32 (_.+ (_.* l32 r00)))) - (_.define x48 (high-16 x32)) (_.set x32 (low-16 x32)) + (_.define x48 (high_16 x32)) (_.set x32 (low_16 x32)) (_.set x32 (|> x32 (_.+ (_.* l16 r16)))) - (_.set x48 (|> x48 (_.+ (high-16 x32)))) (_.set x32 (low-16 x32)) + (_.set x48 (|> x48 (_.+ (high_16 x32)))) (_.set x32 (low_16 x32)) (_.set x32 (|> x32 (_.+ (_.* l00 r32)))) - (_.set x48 (|> x48 (_.+ (high-16 x32)))) (_.set x32 (low-16 x32)) + (_.set x48 (|> x48 (_.+ (high_16 x32)))) (_.set x32 (low_16 x32)) (_.set x48 (|> x48 (_.+ (_.* l48 r00)) (_.+ (_.* l32 r16)) (_.+ (_.* l16 r32)) (_.+ (_.* l00 r48)) - low-16)) + low_16)) - (_.return (i64//new (_.bit-or (up-16 x48) x32) - (_.bit-or (up-16 x16) x00))) + (_.return (i64//new (_.bit_or (up_16 x48) x32) + (_.bit_or (up_16 x16) x00))) )))))) (runtime: (i64//< parameter subject) - (let [negative? (|>> (_.the ..i64-high-field) (_.< (_.i32 +0)))] - (with-vars [-subject? -parameter?] + (let [negative? (|>> (_.the ..i64_high_field) (_.< (_.i32 +0)))] + (with_vars [-subject? -parameter?] ($_ _.then (_.define -subject? (negative? subject)) (_.define -parameter? (negative? parameter)) @@ -542,12 +544,12 @@ (runtime: (i64/// parameter subject) (let [negative? (function (_ value) (i64//< i64//zero value)) - valid-division-check [(i64//= i64//zero parameter) + valid_division_check [(i64//= i64//zero parameter) (_.throw (_.string "Cannot divide by zero!"))] - short-circuit-check [(i64//= i64//zero subject) + short_circuit_check [(i64//= i64//zero subject) (_.return i64//zero)]] - (_.cond (list valid-division-check - short-circuit-check + (_.cond (list valid_division_check + short_circuit_check [(i64//= i64//min subject) (_.cond (list [(_.or (i64//= i64//one parameter) @@ -555,10 +557,10 @@ (_.return i64//min)] [(i64//= i64//min parameter) (_.return i64//one)]) - (with-vars [approximation] - (let [subject/2 (i64//arithmetic-right-shift subject (_.i32 +1))] + (with_vars [approximation] + (let [subject/2 (i64//arithmetic_right_shift subject (_.i32 +1))] ($_ _.then - (_.define approximation (i64//left-shift (i64/// parameter + (_.define approximation (i64//left_shift (i64/// parameter subject/2) (_.i32 +1))) (_.if (i64//= i64//zero approximation) @@ -583,17 +585,17 @@ [(negative? parameter) (_.return (i64//negate (i64/// (i64//negate parameter) subject)))]) - (with-vars [result remainder] + (with_vars [result remainder] ($_ _.then (_.define result i64//zero) (_.define remainder subject) (_.while (i64//<= remainder parameter) - (with-vars [approximate approximate-result approximate-remainder log2 delta] - (let [approximate-result' (i64//from-number approximate) - approx-remainder (i64//* parameter approximate-result)] + (with_vars [approximate approximate_result approximate_remainder log2 delta] + (let [approximate_result' (i64//from_number approximate) + approx_remainder (i64//* parameter approximate_result)] ($_ _.then - (_.define approximate (|> (i64//to-number remainder) - (_./ (i64//to-number parameter)) + (_.define approximate (|> (i64//to_number remainder) + (_./ (i64//to_number parameter)) (_.apply/1 (_.var "Math.floor")) (_.apply/2 (_.var "Math.max") (_.i32 +1)))) (_.define log2 (|> approximate @@ -606,20 +608,20 @@ (_.i32 +2) (_.- (_.i32 +48) log2)))) - (_.define approximate-result approximate-result') - (_.define approximate-remainder approx-remainder) - (_.while (_.or (negative? approximate-remainder) - (i64//< approximate-remainder + (_.define approximate_result approximate_result') + (_.define approximate_remainder approx_remainder) + (_.while (_.or (negative? approximate_remainder) + (i64//< approximate_remainder remainder)) ($_ _.then (_.set approximate (_.- delta approximate)) - (_.set approximate-result approximate-result') - (_.set approximate-remainder approx-remainder))) - (_.set result (i64//+ (_.? (i64//= i64//zero approximate-result) + (_.set approximate_result approximate_result') + (_.set approximate_remainder approx_remainder))) + (_.set result (i64//+ (_.? (i64//= i64//zero approximate_result) i64//one - approximate-result) + approximate_result) result)) - (_.set remainder (i64//- approximate-remainder remainder)))))) + (_.set remainder (i64//- approximate_remainder remainder)))))) (_.return result))) ))) @@ -636,7 +638,7 @@ @i64//2^32 @i64//2^64 @i64//2^63 - @i64//unsigned-low + @i64//unsigned_low @i64//new @i64//zero @i64//min @@ -645,8 +647,8 @@ @i64//= @i64//+ @i64//negate - @i64//to-number - @i64//from-number + @i64//to_number + @i64//from_number @i64//- @i64//* @i64//< @@ -656,24 +658,24 @@ )) (runtime: (text//index start part text) - (with-vars [idx] + (with_vars [idx] ($_ _.then - (_.define idx (|> text (_.do "indexOf" (list part (i64//to-number start))))) + (_.define idx (|> text (_.do "indexOf" (list part (i64//to_number start))))) (_.if (_.= (_.i32 -1) idx) (_.return ..none) - (_.return (..some (i64//from-number idx))))))) + (_.return (..some (i64//from_number idx))))))) (runtime: (text//clip start end text) - (_.return (|> text (_.do "substring" (list (_.the ..i64-low-field start) - (_.the ..i64-low-field end)))))) + (_.return (|> text (_.do "substring" (list (_.the ..i64_low_field start) + (_.the ..i64_low_field end)))))) (runtime: (text//char idx text) - (with-vars [result] + (with_vars [result] ($_ _.then - (_.define result (|> text (_.do "charCodeAt" (list (_.the ..i64-low-field idx))))) - (_.if (_.not-a-number? result) + (_.define result (|> text (_.do "charCodeAt" (list (_.the ..i64_low_field idx))))) + (_.if (_.not_a_number? result) (_.throw (_.string "[Lux Error] Cannot get char from text.")) - (_.return (i64//from-number result)))))) + (_.return (i64//from_number result)))))) (def: runtime//text Statement @@ -687,15 +689,15 @@ (let [console (_.var "console") print (_.var "print") end! (_.return ..unit)] - (_.cond (list [(|> console _.type-of (_.= (_.string "undefined")) _.not + (_.cond (list [(|> console _.type_of (_.= (_.string "undefined")) _.not (_.and (_.the "log" console))) ($_ _.then (_.statement (|> console (_.do "log" (list message)))) end!)] - [(|> print _.type-of (_.= (_.string "undefined")) _.not) + [(|> print _.type_of (_.= (_.string "undefined")) _.not) ($_ _.then (_.statement (_.apply/1 print (_.? (_.= (_.string "string") - (_.type-of message)) + (_.type_of message)) message (_.apply/1 (_.var "JSON.stringify") message)))) end!)]) @@ -712,7 +714,7 @@ )) (runtime: (js//get object field) - (with-vars [temp] + (with_vars [temp] ($_ _.then (_.define temp (_.at field object)) (_.if (_.= _.undefined temp) @@ -739,12 +741,12 @@ (runtime: (array//write idx value array) ($_ _.then - (_.set (_.at (_.the ..i64-low-field idx) array) value) + (_.set (_.at (_.the ..i64_low_field idx) array) value) (_.return array))) (runtime: (array//delete idx array) ($_ _.then - (_.delete (_.at (_.the ..i64-low-field idx) array)) + (_.delete (_.at (_.the ..i64_low_field idx) array)) (_.return array))) (def: runtime//array diff --git a/stdlib/source/lux/tool/compiler/meta/packager/script.lux b/stdlib/source/lux/tool/compiler/meta/packager/script.lux index 543b2682a..1dd13c664 100644 --- a/stdlib/source/lux/tool/compiler/meta/packager/script.lux +++ b/stdlib/source/lux/tool/compiler/meta/packager/script.lux @@ -38,50 +38,50 @@ (type: (Action ! a) (! (Try a))) -(def: (write-artifact monad file-system static context) +(def: (write_artifact monad file_system static context) (All [!] (-> (Monad !) (file.System !) Static Context (Action ! Binary))) (do (try.with monad) [artifact (let [[module artifact] context] - (!.use (\ file-system file) [(io.artifact file-system static module (%.nat artifact))]))] + (!.use (\ file_system file) [(io.artifact file_system static module (%.nat artifact))]))] (!.use (\ artifact content) []))) -(def: (write-module monad file-system static sequence [module artifacts] so-far) +(def: (write_module monad file_system static sequence [module artifacts] so_far) (All [! directive] (-> (Monad !) (file.System !) Static (-> directive directive directive) [archive.ID (List artifact.ID)] directive (Action ! directive))) (monad.fold (:assume (try.with monad)) - (function (_ artifact so-far) + (function (_ artifact so_far) (do (try.with monad) - [content (..write-artifact monad file-system static [module artifact]) + [content (..write_artifact monad file_system static [module artifact]) content (\ monad wrap (\ encoding.utf8 decode content))] - (wrap (sequence so-far + (wrap (sequence so_far (:share [directive] {directive - so-far} + so_far} {directive (:assume content)}))))) - so-far + so_far artifacts)) -(def: #export (package header to-code sequence) +(def: #export (package header to_code sequence) (All [! directive] (-> directive (-> directive Text) (-> directive directive directive) (Packager !))) - (function (package monad file-system static archive program) + (function (package monad file_system static archive program) (do {! (try.with monad)} - [cache (!.use (\ file-system directory) [(get@ #static.target static)]) - order (\ monad wrap (dependency.load-order $.key archive))] + [cache (!.use (\ file_system directory) [(get@ #static.target static)]) + order (\ monad wrap (dependency.load_order $.key archive))] (|> order - (list\map (function (_ [module [module-id [descriptor document]]]) - [module-id + (list\map (function (_ [module [module_id [descriptor document]]]) + [module_id (|> descriptor (get@ #descriptor.registry) artifact.artifacts - row.to-list + row.to_list (list\map (|>> (get@ #artifact.id))))])) - (monad.fold ! (..write-module monad file-system static sequence) header) - (\ ! map (|>> to-code (\ encoding.utf8 encode))))))) + (monad.fold ! (..write_module monad file_system static sequence) header) + (\ ! map (|>> to_code (\ encoding.utf8 encode))))))) diff --git a/stdlib/source/lux/type/abstract.lux b/stdlib/source/lux/type/abstract.lux index d65093d7c..0bfb00872 100644 --- a/stdlib/source/lux/type/abstract.lux +++ b/stdlib/source/lux/type/abstract.lux @@ -16,11 +16,8 @@ [macro ["." code] [syntax (#+ syntax:) - ["cs" common - ["csr" reader] - ["csw" writer] - ["|.|" export] - ["|.|" annotations]]]]]) + ["|.|" export] + ["|.|" annotations]]]]) (type: Stack List) diff --git a/stdlib/source/lux/type/unit.lux b/stdlib/source/lux/type/unit.lux index 8fad9d2a6..ff6d3bb3a 100644 --- a/stdlib/source/lux/type/unit.lux +++ b/stdlib/source/lux/type/unit.lux @@ -15,11 +15,8 @@ [macro ["." code] [syntax (#+ syntax:) - ["cs" common - ["csr" reader] - ["csw" writer] - ["|.|" export] - ["|.|" annotations]]]] + ["|.|" export] + ["|.|" annotations]]] [math [number ["i" int] diff --git a/stdlib/source/poly/lux/abstract/equivalence.lux b/stdlib/source/poly/lux/abstract/equivalence.lux index fabd4b335..8ac11dbb1 100644 --- a/stdlib/source/poly/lux/abstract/equivalence.lux +++ b/stdlib/source/poly/lux/abstract/equivalence.lux @@ -21,10 +21,9 @@ ["." dictionary (#+ Dictionary)] ["." tree]]] [macro + [syntax (#+ syntax:)] ["." code] - ["." poly (#+ poly:)] - [syntax (#+ syntax:) - ["." common]]] + ["." poly (#+ poly:)]] [math [number ["." nat ("#\." decimal)] diff --git a/stdlib/source/poly/lux/abstract/functor.lux b/stdlib/source/poly/lux/abstract/functor.lux index 741a1b851..66ea54f50 100644 --- a/stdlib/source/poly/lux/abstract/functor.lux +++ b/stdlib/source/poly/lux/abstract/functor.lux @@ -14,9 +14,8 @@ [collection ["." list ("#\." monad monoid)]]] [macro + [syntax (#+ syntax:)] ["." code] - [syntax (#+ syntax:) - ["." common]] ["." poly (#+ poly:)]] [math [number diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux index 6c1a9202c..2788783cc 100644 --- a/stdlib/source/program/compositor.lux +++ b/stdlib/source/program/compositor.lux @@ -7,8 +7,6 @@ [control ["." io (#+ IO io)] ["." try (#+ Try)] - [parser - [cli (#+ program:)]] [security ["!" capability]] [concurrency diff --git a/stdlib/source/spec/lux/abstract/enum.lux b/stdlib/source/spec/lux/abstract/enum.lux index e598179ad..6d28dead8 100644 --- a/stdlib/source/spec/lux/abstract/enum.lux +++ b/stdlib/source/spec/lux/abstract/enum.lux @@ -8,19 +8,19 @@ {1 ["." /]}) -(def: #export (spec (^open "@//.") gen-sample) +(def: #export (spec (^open "\.") gen-sample) (All [a] (-> (/.Enum a) (Random a) Test)) (do random.monad [sample gen-sample] (<| (_.for [/.Enum]) ($_ _.and (_.test "Successor and predecessor are inverse functions." - (and (@//= (|> sample @//succ @//pred) - sample) - (@//= (|> sample @//pred @//succ) - sample) - (not (@//= (@//succ sample) - sample)) - (not (@//= (@//pred sample) - sample)))) + (and (\= (|> sample \succ \pred) + sample) + (\= (|> sample \pred \succ) + sample) + (not (\= (\succ sample) + sample)) + (not (\= (\pred sample) + sample)))) )))) diff --git a/stdlib/source/test/aedifex/artifact.lux b/stdlib/source/test/aedifex/artifact.lux index 959b857dd..60619f78b 100644 --- a/stdlib/source/test/aedifex/artifact.lux +++ b/stdlib/source/test/aedifex/artifact.lux @@ -22,7 +22,8 @@ ["#." type] ["#." extension] ["#." time_stamp #_ - ["#/." date]]] + ["#/." date] + ["#/." time]]] {#program ["." /]}) @@ -45,4 +46,5 @@ /type.test /extension.test /time_stamp/date.test + /time_stamp/time.test )))) diff --git a/stdlib/source/test/aedifex/artifact/time_stamp/time.lux b/stdlib/source/test/aedifex/artifact/time_stamp/time.lux new file mode 100644 index 000000000..bd9bbe071 --- /dev/null +++ b/stdlib/source/test/aedifex/artifact/time_stamp/time.lux @@ -0,0 +1,31 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + ["." time (#+ Time)] + [abstract + [monad (#+ do)]] + [control + ["." try ("#\." functor)] + [parser + ["<.>" text]]] + [math + ["." random (#+ Random)] + [number + ["n" nat] + ["i" int]]]] + {#program + ["." /]}) + +(def: #export test + Test + (<| (_.covering /._) + ($_ _.and + (do random.monad + [expected random.time] + (_.cover [/.format /.parser] + (|> expected + /.format + (.run /.parser) + (try\map (\ time.equivalence = expected)) + (try.default false)))) + ))) diff --git a/stdlib/source/test/lux/macro.lux b/stdlib/source/test/lux/macro.lux index 35476eee0..54370efb9 100644 --- a/stdlib/source/test/lux/macro.lux +++ b/stdlib/source/test/lux/macro.lux @@ -5,8 +5,7 @@ ["#." code] ["#." template] ["#." poly] - ["#." syntax - ["#/." common]]]) + ["#." syntax]]) (def: #export test Test @@ -14,6 +13,5 @@ /code.test /template.test /syntax.test - /syntax/common.test /poly.test )) diff --git a/stdlib/source/test/lux/macro/poly/json.lux b/stdlib/source/test/lux/macro/poly/json.lux index 98b955af8..f69af1397 100644 --- a/stdlib/source/test/lux/macro/poly/json.lux +++ b/stdlib/source/test/lux/macro/poly/json.lux @@ -49,7 +49,7 @@ [time ["_." instant] ## ["_." duration] - ["_." date]]]]) + ]]]) (type: Variant (#Bit Bit) @@ -103,7 +103,7 @@ ..gen_recursive ## _instant.instant ## _duration.duration - _date.date + random.date ..qty ))) diff --git a/stdlib/source/test/lux/macro/syntax/annotations.lux b/stdlib/source/test/lux/macro/syntax/annotations.lux new file mode 100644 index 000000000..564af4ea1 --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/annotations.lux @@ -0,0 +1,53 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)] + {[0 #spec] + [/ + ["$." equivalence]]}] + [control + ["." try] + [parser + ["<.>" code]]] + [data + [collection + ["." list]]] + [math + ["." random (#+ Random)] + [number + ["n" nat]]]] + {1 + ["." /]} + ["$." /// #_ + ["#." code]]) + +(def: #export random + (Random /.Annotations) + (let [word (random.ascii/alpha 10) + tag (random.and word word)] + (do {! random.monad} + [size (\ ! map (n.% 10) random.nat)] + (random.list size (random.and tag $///code.random))))) + +(def: #export test + Test + (<| (_.covering /._) + (_.for [/.Annotations]) + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence ..random)) + + (_.cover [/.empty] + (list.empty? /.empty)) + (do random.monad + [expected ..random] + (_.cover [/.write /.parser] + (case (.run /.parser + (list (/.write expected))) + (#try.Failure _) + false + + (#try.Success actual) + (\ /.equivalence = expected actual)))) + ))) diff --git a/stdlib/source/test/lux/macro/syntax/check.lux b/stdlib/source/test/lux/macro/syntax/check.lux new file mode 100644 index 000000000..898ad8abb --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/check.lux @@ -0,0 +1,48 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)] + {[0 #spec] + [/ + ["$." equivalence]]}] + [control + ["." try] + ["<>" parser + ["<.>" code]]] + [math + ["." random (#+ Random)]] + [macro + ["." code ("#\." equivalence)]]] + {1 + ["." /]} + ["$." /// #_ + ["#." code]]) + +(def: #export random + (Random /.Check) + ($_ random.and + $///code.random + $///code.random + )) + +(def: #export test + Test + (<| (_.covering /._) + (_.for [/.Check]) + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence ..random)) + + (do random.monad + [[type value] ..random] + (_.cover [/.write /.parser] + (case (.run /.parser + (list (/.write {#/.type type + #/.value value}))) + (#try.Failure _) + false + + (#try.Success check) + (and (code\= type (get@ #/.type check)) + (code\= value (get@ #/.value check))))))))) diff --git a/stdlib/source/test/lux/macro/syntax/common.lux b/stdlib/source/test/lux/macro/syntax/common.lux deleted file mode 100644 index 2929417e3..000000000 --- a/stdlib/source/test/lux/macro/syntax/common.lux +++ /dev/null @@ -1,71 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)] - [equivalence (#+ Equivalence)]] - [control - [pipe (#+ case>)] - ["." try] - ["<>" parser - ["" code]]] - [data - ["." product] - ["." bit ("#\." equivalence)] - ["." name] - ["." text] - [collection - ["." list]]] - [macro - ["." code]] - [math - ["." random (#+ Random)] - [number - ["n" nat]]]] - {1 - ["." / - ["#." reader] - ["#." writer]]} - ["." /// #_ - ["#." code]] - ["." / #_ - ["#." annotations] - ["#." check] - ["#." declaration] - ["#." definition] - ["#." export] - ["#." type #_ - ["#/." variable]]]) - -(def: random_text - (Random Text) - (random.ascii/alpha 10)) - -(def: #export test - Test - (<| (_.covering /._) - (_.covering /reader._) - (_.covering /writer._) - ($_ _.and - (do {! random.monad} - [expected (: (Random /.Typed_Input) - (random.and ///code.random - ///code.random))] - (_.cover [/.Typed_Input /reader.typed_input /writer.typed_input] - (|> expected - /writer.typed_input list - (.run /reader.typed_input) - (case> (#try.Success actual) - (let [equivalence (product.equivalence code.equivalence code.equivalence)] - (\ equivalence = expected actual)) - - (#try.Failure error) - false)))) - - /annotations.test - /check.test - /declaration.test - /definition.test - /export.test - /type/variable.test - ))) diff --git a/stdlib/source/test/lux/macro/syntax/common/annotations.lux b/stdlib/source/test/lux/macro/syntax/common/annotations.lux deleted file mode 100644 index b1369ef48..000000000 --- a/stdlib/source/test/lux/macro/syntax/common/annotations.lux +++ /dev/null @@ -1,53 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)] - {[0 #spec] - [/ - ["$." equivalence]]}] - [control - ["." try] - [parser - ["<.>" code]]] - [data - [collection - ["." list]]] - [math - ["." random (#+ Random)] - [number - ["n" nat]]]] - {1 - ["." /]} - ["$." //// #_ - ["#." code]]) - -(def: #export random - (Random /.Annotations) - (let [word (random.ascii/alpha 10) - tag (random.and word word)] - (do {! random.monad} - [size (\ ! map (n.% 10) random.nat)] - (random.list size (random.and tag $////code.random))))) - -(def: #export test - Test - (<| (_.covering /._) - (_.for [/.Annotations]) - ($_ _.and - (_.for [/.equivalence] - ($equivalence.spec /.equivalence ..random)) - - (_.cover [/.empty] - (list.empty? /.empty)) - (do random.monad - [expected ..random] - (_.cover [/.write /.parser] - (case (.run /.parser - (list (/.write expected))) - (#try.Failure _) - false - - (#try.Success actual) - (\ /.equivalence = expected actual)))) - ))) diff --git a/stdlib/source/test/lux/macro/syntax/common/check.lux b/stdlib/source/test/lux/macro/syntax/common/check.lux deleted file mode 100644 index 6b4a4ab3d..000000000 --- a/stdlib/source/test/lux/macro/syntax/common/check.lux +++ /dev/null @@ -1,48 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)] - {[0 #spec] - [/ - ["$." equivalence]]}] - [control - ["." try] - ["<>" parser - ["<.>" code]]] - [math - ["." random (#+ Random)]] - [macro - ["." code ("#\." equivalence)]]] - {1 - ["." /]} - ["$." //// #_ - ["#." code]]) - -(def: #export random - (Random /.Check) - ($_ random.and - $////code.random - $////code.random - )) - -(def: #export test - Test - (<| (_.covering /._) - (_.for [/.Check]) - ($_ _.and - (_.for [/.equivalence] - ($equivalence.spec /.equivalence ..random)) - - (do random.monad - [[type value] ..random] - (_.cover [/.write /.parser] - (case (.run /.parser - (list (/.write {#/.type type - #/.value value}))) - (#try.Failure _) - false - - (#try.Success check) - (and (code\= type (get@ #/.type check)) - (code\= value (get@ #/.value check))))))))) diff --git a/stdlib/source/test/lux/macro/syntax/common/declaration.lux b/stdlib/source/test/lux/macro/syntax/common/declaration.lux deleted file mode 100644 index a9bc23296..000000000 --- a/stdlib/source/test/lux/macro/syntax/common/declaration.lux +++ /dev/null @@ -1,47 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)] - {[0 #spec] - [/ - ["$." equivalence]]}] - [control - ["." try] - [parser - ["<.>" code]]] - [math - ["." random (#+ Random)] - [number - ["n" nat]]]] - {1 - ["." /]}) - -(def: #export random - (Random /.Declaration) - (let [word (random.ascii/alpha 10)] - ($_ random.and - word - (do {! random.monad} - [size (\ ! map (n.% 10) random.nat)] - (random.list size word)) - ))) - -(def: #export test - Test - (<| (_.covering /._) - (_.for [/.Declaration]) - ($_ _.and - (_.for [/.equivalence] - ($equivalence.spec /.equivalence ..random)) - - (do random.monad - [expected ..random] - (_.cover [/.write /.parser] - (case (.run /.parser - (list (/.write expected))) - (#try.Failure _) - false - - (#try.Success actual) - (\ /.equivalence = expected actual))))))) diff --git a/stdlib/source/test/lux/macro/syntax/common/definition.lux b/stdlib/source/test/lux/macro/syntax/common/definition.lux deleted file mode 100644 index a769df641..000000000 --- a/stdlib/source/test/lux/macro/syntax/common/definition.lux +++ /dev/null @@ -1,97 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)] - {[0 #spec] - [/ - ["$." equivalence]]}] - [control - ["." try] - ["." exception] - ["<>" parser - ["<.>" code]]] - [math - ["." random (#+ Random)]] - [macro - ["." code ("#\." equivalence)]] - [meta - ["." location]]] - {1 - ["." /]} - ["$."// #_ - ["#." check] - ["#." annotations] - ["#//" /// #_ - ["#." code]]]) - -(def: #export random - (Random /.Definition) - ($_ random.and - (random.ascii/alpha 5) - (random.or $//check.random - $////code.random) - $//annotations.random - random.bit - )) - -(def: compiler - {#.info {#.target "FAKE" - #.version "0.0.0" - #.mode #.Build} - #.source [location.dummy 0 ""] - #.location location.dummy - #.current_module #.None - #.modules (list) - #.scopes (list) - #.type_context {#.ex_counter 0 - #.var_counter 0 - #.var_bindings (list)} - #.expected #.None - #.seed 0 - #.scope_type_vars (list) - #.extensions [] - #.host []}) - -(def: #export test - Test - (<| (_.covering /._) - (_.for [/.Definition]) - ($_ _.and - (_.for [/.equivalence] - ($equivalence.spec /.equivalence ..random)) - - (do random.monad - [expected ..random - - type $////code.random - untyped_value $////code.random] - ($_ _.and - (_.cover [/.write /.parser] - (case (.run (/.parser compiler) - (list (/.write expected))) - (#try.Failure error) - false - - (#try.Success actual) - (\ /.equivalence = expected actual))) - (_.cover [/.typed] - (let [expected (set@ #/.value (#.Left [type untyped_value]) expected)] - (case (.run (/.typed compiler) - (list (/.write expected))) - (#try.Failure error) - false - - (#try.Success actual) - (\ /.equivalence = expected actual)))) - (_.cover [/.lacks_type!] - (let [expected (set@ #/.value (#.Right untyped_value) expected)] - (case (.run (/.typed compiler) - (list (/.write expected))) - (#try.Failure error) - (exception.match? /.lacks_type! error) - - (#try.Success actual) - false))) - ))) - )) diff --git a/stdlib/source/test/lux/macro/syntax/common/export.lux b/stdlib/source/test/lux/macro/syntax/common/export.lux deleted file mode 100644 index 59b72eb0f..000000000 --- a/stdlib/source/test/lux/macro/syntax/common/export.lux +++ /dev/null @@ -1,29 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)]] - [control - ["." try] - [parser - ["<.>" code]]] - [data - ["." bit ("#\." equivalence)]] - [math - ["." random]]] - {1 - ["." /]}) - -(def: #export test - Test - (<| (_.covering /._) - (do random.monad - [expected random.bit] - (_.cover [/.write /.parser] - (case (.run /.parser - (/.write expected)) - (#try.Failure _) - false - - (#try.Success actual) - (bit\= expected actual)))))) diff --git a/stdlib/source/test/lux/macro/syntax/common/type/variable.lux b/stdlib/source/test/lux/macro/syntax/common/type/variable.lux deleted file mode 100644 index 4701f5aef..000000000 --- a/stdlib/source/test/lux/macro/syntax/common/type/variable.lux +++ /dev/null @@ -1,37 +0,0 @@ -(.module: - [lux #* - ["_" test (#+ Test)] - [abstract - [monad (#+ do)] - {[0 #spec] - [/ - ["$." equivalence]]}] - [control - ["." try ("#\." functor)] - [parser - ["<.>" code]]] - [math - ["." random (#+ Random)]]] - {1 - ["." /]}) - -(def: #export random - (Random /.Variable) - (random.ascii/alpha 10)) - -(def: #export test - Test - (<| (_.covering /._) - (_.for [/.Variable]) - ($_ _.and - (_.for [/.equivalence] - ($equivalence.spec /.equivalence ..random)) - - (do random.monad - [expected ..random] - (_.cover [/.format /.parser] - (|> (list (/.format expected)) - (.run /.parser) - (try\map (\ /.equivalence = expected)) - (try.default false)))) - ))) diff --git a/stdlib/source/test/lux/macro/syntax/declaration.lux b/stdlib/source/test/lux/macro/syntax/declaration.lux new file mode 100644 index 000000000..a9bc23296 --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/declaration.lux @@ -0,0 +1,47 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)] + {[0 #spec] + [/ + ["$." equivalence]]}] + [control + ["." try] + [parser + ["<.>" code]]] + [math + ["." random (#+ Random)] + [number + ["n" nat]]]] + {1 + ["." /]}) + +(def: #export random + (Random /.Declaration) + (let [word (random.ascii/alpha 10)] + ($_ random.and + word + (do {! random.monad} + [size (\ ! map (n.% 10) random.nat)] + (random.list size word)) + ))) + +(def: #export test + Test + (<| (_.covering /._) + (_.for [/.Declaration]) + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence ..random)) + + (do random.monad + [expected ..random] + (_.cover [/.write /.parser] + (case (.run /.parser + (list (/.write expected))) + (#try.Failure _) + false + + (#try.Success actual) + (\ /.equivalence = expected actual))))))) diff --git a/stdlib/source/test/lux/macro/syntax/definition.lux b/stdlib/source/test/lux/macro/syntax/definition.lux new file mode 100644 index 000000000..d6b101894 --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/definition.lux @@ -0,0 +1,97 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)] + {[0 #spec] + [/ + ["$." equivalence]]}] + [control + ["." try] + ["." exception] + ["<>" parser + ["<.>" code]]] + [math + ["." random (#+ Random)]] + [macro + ["." code ("#\." equivalence)]] + [meta + ["." location]]] + {1 + ["." /]} + ["$."// #_ + ["#." check] + ["#." annotations] + ["#/" // #_ + ["#." code]]]) + +(def: #export random + (Random /.Definition) + ($_ random.and + (random.ascii/alpha 5) + (random.or $//check.random + $///code.random) + $//annotations.random + random.bit + )) + +(def: compiler + {#.info {#.target "FAKE" + #.version "0.0.0" + #.mode #.Build} + #.source [location.dummy 0 ""] + #.location location.dummy + #.current_module #.None + #.modules (list) + #.scopes (list) + #.type_context {#.ex_counter 0 + #.var_counter 0 + #.var_bindings (list)} + #.expected #.None + #.seed 0 + #.scope_type_vars (list) + #.extensions [] + #.host []}) + +(def: #export test + Test + (<| (_.covering /._) + (_.for [/.Definition]) + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence ..random)) + + (do random.monad + [expected ..random + + type $///code.random + untyped_value $///code.random] + ($_ _.and + (_.cover [/.write /.parser] + (case (.run (/.parser compiler) + (list (/.write expected))) + (#try.Failure error) + false + + (#try.Success actual) + (\ /.equivalence = expected actual))) + (_.cover [/.typed] + (let [expected (set@ #/.value (#.Left [type untyped_value]) expected)] + (case (.run (/.typed compiler) + (list (/.write expected))) + (#try.Failure error) + false + + (#try.Success actual) + (\ /.equivalence = expected actual)))) + (_.cover [/.lacks_type!] + (let [expected (set@ #/.value (#.Right untyped_value) expected)] + (case (.run (/.typed compiler) + (list (/.write expected))) + (#try.Failure error) + (exception.match? /.lacks_type! error) + + (#try.Success actual) + false))) + ))) + )) diff --git a/stdlib/source/test/lux/macro/syntax/export.lux b/stdlib/source/test/lux/macro/syntax/export.lux new file mode 100644 index 000000000..59b72eb0f --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/export.lux @@ -0,0 +1,29 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)]] + [control + ["." try] + [parser + ["<.>" code]]] + [data + ["." bit ("#\." equivalence)]] + [math + ["." random]]] + {1 + ["." /]}) + +(def: #export test + Test + (<| (_.covering /._) + (do random.monad + [expected random.bit] + (_.cover [/.write /.parser] + (case (.run /.parser + (/.write expected)) + (#try.Failure _) + false + + (#try.Success actual) + (bit\= expected actual)))))) diff --git a/stdlib/source/test/lux/macro/syntax/input.lux b/stdlib/source/test/lux/macro/syntax/input.lux new file mode 100644 index 000000000..b0b642645 --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/input.lux @@ -0,0 +1,46 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)] + {[0 #spec] + [/ + ["$." equivalence]]}] + [control + ["." try] + [parser + ["<.>" code]]] + [math + ["." random (#+ Random)] + [number + ["n" nat]]]] + {1 + ["." /]} + ["$." /// #_ + ["#." code]]) + +(def: #export random + (Random /.Input) + ($_ random.and + $///code.random + $///code.random + )) + +(def: #export test + Test + (<| (_.covering /._) + (_.for [/.Input]) + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence ..random)) + + (do random.monad + [expected ..random] + (_.cover [/.format /.parser] + (case (.run /.parser + (list (/.format expected))) + (#try.Failure _) + false + + (#try.Success actual) + (\ /.equivalence = expected actual))))))) diff --git a/stdlib/source/test/lux/macro/syntax/type/variable.lux b/stdlib/source/test/lux/macro/syntax/type/variable.lux new file mode 100644 index 000000000..4701f5aef --- /dev/null +++ b/stdlib/source/test/lux/macro/syntax/type/variable.lux @@ -0,0 +1,37 @@ +(.module: + [lux #* + ["_" test (#+ Test)] + [abstract + [monad (#+ do)] + {[0 #spec] + [/ + ["$." equivalence]]}] + [control + ["." try ("#\." functor)] + [parser + ["<.>" code]]] + [math + ["." random (#+ Random)]]] + {1 + ["." /]}) + +(def: #export random + (Random /.Variable) + (random.ascii/alpha 10)) + +(def: #export test + Test + (<| (_.covering /._) + (_.for [/.Variable]) + ($_ _.and + (_.for [/.equivalence] + ($equivalence.spec /.equivalence ..random)) + + (do random.monad + [expected ..random] + (_.cover [/.format /.parser] + (|> (list (/.format expected)) + (.run /.parser) + (try\map (\ /.equivalence = expected)) + (try.default false)))) + ))) diff --git a/stdlib/source/test/lux/macro/template.lux b/stdlib/source/test/lux/macro/template.lux index 5733f40ad..53d7d114e 100644 --- a/stdlib/source/test/lux/macro/template.lux +++ b/stdlib/source/test/lux/macro/template.lux @@ -13,6 +13,12 @@ {1 ["." /]}) +(/.with [(!pow/2 ) + (nat.* )] + (def: pow/2 + (-> Nat Nat) + (|>> !pow/2))) + (def: #export test Test (<| (_.covering /._) @@ -59,5 +65,37 @@ var1 right] (and (nat.= left var0) (nat.= right var1))))) + (do ! + [scalar random.nat] + (_.cover [/.with] + (let [can_use_with_statements! + (nat.= ($_ nat.* scalar scalar) + (..pow/2 scalar))] + (and can_use_with_statements! + (/.with [(pow/3 ) + ($_ nat.* ) + + (pow/9 ) + (pow/3 (pow/3 ))] + (let [can_use_with_expressions! + (nat.= ($_ nat.* scalar scalar scalar) + (pow/3 scalar)) + + can_refer! + (nat.= ($_ nat.* + scalar scalar scalar + scalar scalar scalar + scalar scalar scalar) + (pow/9 scalar)) + + can_shadow! + (let [pow/3 (function (_ scalar) + ($_ nat.+ scalar scalar scalar))] + (nat.= ($_ nat.+ scalar scalar scalar) + (pow/3 scalar)))] + (and can_use_with_expressions! + can_refer! + can_shadow!))) + )))) ))) )) diff --git a/stdlib/source/test/lux/time/date.lux b/stdlib/source/test/lux/time/date.lux index 7ad0e8ddc..1c569e476 100644 --- a/stdlib/source/test/lux/time/date.lux +++ b/stdlib/source/test/lux/time/date.lux @@ -1,35 +1,91 @@ (.module: [lux #* - ["%" data/text/format (#+ format)] ["_" test (#+ Test)] - [math - ["." random (#+ Random)]] [abstract - ["." monad (#+ do)] + [monad (#+ do)] {[0 #spec] [/ ["$." equivalence] ["$." order] + ["$." enum] ["$." codec]]}] [control - ["." try]]] - [// - ["_." instant]] + ["." try ("#\." functor)] + ["." exception] + [parser + ["<.>" text]]] + [data + [text + ["%" format (#+ format)]]] + [math + ["." random (#+ Random)] + [number + ["n" nat]]]] {1 - ["." / (#+ Date) - ["." // #_ - ["#." instant]]]}) - -(def: #export date - (Random Date) - (\ random.monad map //instant.date - _instant.instant)) + ["." /]}) (def: #export test Test - (<| (_.context (%.name (name_of /._))) + (<| (_.covering /._) + (_.for [/.Date]) ($_ _.and - ($equivalence.spec /.equivalence ..date) - ($order.spec /.order ..date) - ($codec.spec /.equivalence /.codec ..date) + (_.for [/.equivalence] + ($equivalence.spec /.equivalence random.date)) + (_.for [/.order] + ($order.spec /.order random.date)) + (_.for [/.enum] + ($enum.spec /.enum random.date)) + (_.for [/.codec] + ($codec.spec /.equivalence /.codec random.date)) + + (do random.monad + [expected random.date] + (_.cover [/.date /.year /.month /.day_of_month] + (|> (/.date (/.year expected) + (/.month expected) + (/.day_of_month expected)) + (try\map (\ /.equivalence = expected)) + (try.default false)))) + (do random.monad + [expected random.date] + (_.cover [/.invalid_day] + (case (/.date (/.year expected) + (/.month expected) + (n.+ 31 (/.day_of_month expected))) + (#try.Failure error) + (exception.match? /.invalid_day error) + + (#try.Success _) + false))) + (do random.monad + [expected random.date] + (_.cover [/.to_days /.from_days] + (|> expected + /.to_days + /.from_days + (\ /.equivalence = expected)))) + (do random.monad + [expected random.date] + (_.cover [/.parser] + (|> (\ /.codec encode expected) + (.run /.parser) + (try\map (\ /.equivalence = expected)) + (try.default false)))) + (do {! random.monad} + [year (\ ! map (|>> (n.% 10,000) inc) + random.nat) + month (\ ! map (|>> (n.% 10) (n.+ 13)) + random.nat) + day (\ ! map (|>> (n.% 10) (n.+ 10)) + random.nat) + #let [input (format (%.nat year) + "-" (%.nat month) + "-" (%.nat day))]] + (_.cover [/.invalid_month] + (case (.run /.parser input) + (#try.Failure error) + (exception.match? /.invalid_month error) + + (#try.Success _) + false))) ))) -- cgit v1.2.3