diff options
Diffstat (limited to '')
18 files changed, 464 insertions, 366 deletions
diff --git a/stdlib/commands.md b/stdlib/commands.md index 542735a39..a2329b8f0 100644 --- a/stdlib/commands.md +++ b/stdlib/commands.md @@ -58,10 +58,35 @@ cd ~/lux/stdlib/ \ && lux clean \ && lux with jvm with scriptum auto test +### JVM cd ~/lux/stdlib/ \ && lux clean \ && lux with jvm with scriptum build \ -&& java -jar target/program.jar > ~/documentation.md +&& java -jar target/program.jar > ~/lux/documentation/library/standard/jvm.md + +### JS +cd ~/lux/stdlib/ \ +&& lux clean \ +&& lux with js with scriptum build \ +&& node ~/lux/stdlib/target/program.js > ~/lux/documentation/library/standard/js.md + +### Python +cd ~/lux/stdlib/ \ +&& lux clean \ +&& lux with python with scriptum build \ +&& python3 ~/lux/stdlib/target/program.py > ~/lux/documentation/library/standard/python.md + +### Lua +cd ~/lux/stdlib/ \ +&& lux clean \ +&& lux with lua with scriptum build \ +&& ~/lua-5.4.2/install/bin/lua ~/lux/stdlib/target/program.lua > ~/lux/documentation/library/standard/lua.md + +### Ruby +cd ~/lux/stdlib/ \ +&& lux clean \ +&& lux with ruby with scriptum build \ +&& RUBY_THREAD_VM_STACK_SIZE=15700000 ruby ~/lux/stdlib/target/program.rb | tee ~/lux/documentation/library/standard/ruby.md ``` --- diff --git a/stdlib/source/documentation/lux.lux b/stdlib/source/documentation/lux.lux index 91480ba4c..8fcfe64d9 100644 --- a/stdlib/source/documentation/lux.lux +++ b/stdlib/source/documentation/lux.lux @@ -1,46 +1,43 @@ (.using - [library - [lux - [program {"+" program:}] - ["$" documentation {"+" documentation:}] - ["[0]" debug] - [control - ["[0]" io] - ["<>" parser - ["<[0]>" code]]] - [data - ["[0]" text {"+" \n} - ["%" format {"+" format}]] - [collection - ["[0]" list] - ["[0]" set]]] - [macro - ["[0]" template]]]] - [\\library - ["[0]" /]] - ["[0]" / "_" - ["[1][0]" abstract] - ["[1][0]" control] - ["[1][0]" data] - ["[1][0]" debug] - ["[1][0]" documentation] - ["[1][0]" extension] - ["[1][0]" ffi] - ["[1][0]" locale] - ["[1][0]" macro] - ["[1][0]" math] - ["[1][0]" meta] - ["[1][0]" program] - ["[1][0]" static] - ["[1][0]" target] - ["[1][0]" test] - ["[1][0]" time] - ["[1][0]" tool] ... TODO: Documentation for this - ["[1][0]" type] - ["[1][0]" world] - ... ["[1][0]" target "_" - ... <target>] - ]) + [library + [lux + [program {"+" program:}] + ["$" documentation {"+" documentation:}] + ["[0]" debug] + [control + ["[0]" io] + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]] + [collection + ["[0]" list] + ["[0]" set]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]] + ["[0]" / "_" + ["[1][0]" abstract] + ["[1][0]" control] + ["[1][0]" data] + ["[1][0]" debug] + ["[1][0]" documentation] + ["[1][0]" extension] + ["[1][0]" ffi] + ["[1][0]" locale] + ["[1][0]" macro] + ["[1][0]" math] + ["[1][0]" meta] + ["[1][0]" program] + ["[1][0]" static] + ["[1][0]" target] + ["[1][0]" test] + ["[1][0]" time] + ["[1][0]" tool] ... TODO: Documentation for this + ["[1][0]" type] + ["[1][0]" world]]) (documentation: /.prelude_module (format "The name of the prelude module" @@ -597,16 +594,16 @@ (documentation: /.using "Module-definition macro." [(.using - [lux "*" - [control - ["M" monad "*"]] - [data - maybe - ["[0]" name ("[1]#[0]" codec)]] - [macro - code]] - [// - [type ("[0]" equivalence)]])]) + [lux "*" + [control + ["M" monad "*"]] + [data + maybe + ["[0]" name ("[1]#[0]" codec)]] + [macro + code]] + [// + [type ("[0]" equivalence)]])]) (documentation: /.# "Allows accessing the value of a implementation's member." diff --git a/stdlib/source/documentation/lux/ffi.lua.lux b/stdlib/source/documentation/lux/ffi.lua.lux new file mode 100644 index 000000000..79d6f03ac --- /dev/null +++ b/stdlib/source/documentation/lux/ffi.lua.lux @@ -0,0 +1,38 @@ +(.using + [library + [lux {"-" int char type :as} + ["$" documentation {"+" documentation:}] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]]) + +(documentation: /.import: + "Easily import types, methods, functions and constants." + [(import: (os/getenv [..String] "io" "?" ..String))]) + +(documentation: /.closure + (format "Allows defining closures/anonymous-functions in the form that Lua expects." + \n "This is useful for adapting Lux functions for usage by Lua code.") + [(: ..Function + (closure [left right] + (do_something (:as Foo left) (:as Bar right))))]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + "" + [..import: + ..closure + ($.default (/.Object brand)) + ($.default /.Nil) + ($.default /.Function) + ($.default /.Table) + ($.default /.Boolean) + ($.default /.Integer) + ($.default /.Float) + ($.default /.String)] + [])) diff --git a/stdlib/source/documentation/lux/ffi.py.lux b/stdlib/source/documentation/lux/ffi.py.lux new file mode 100644 index 000000000..6b24c1926 --- /dev/null +++ b/stdlib/source/documentation/lux/ffi.py.lux @@ -0,0 +1,59 @@ +(.using + [library + [lux {"-" int char type :as} + ["$" documentation {"+" documentation:}] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]]) + +(documentation: /.import: + "Easily import types, methods, functions and constants." + [(import: os + ["[1]::[0]" + ("static" F_OK Integer) + ("static" R_OK Integer) + ("static" W_OK Integer) + ("static" X_OK Integer) + + ("static" mkdir [String] "io" "try" "?" Any) + ("static" access [String Integer] "io" "try" Boolean) + ("static" remove [String] "io" "try" "?" Any) + ("static" rmdir [String] "io" "try" "?" Any) + ("static" rename [String String] "io" "try" "?" Any) + ("static" listdir [String] "io" "try" (Array String))]) + + (import: os/path + ["[1]::[0]" + ("static" isfile [String] "io" "try" Boolean) + ("static" isdir [String] "io" "try" Boolean) + ("static" sep String) + ("static" getsize [String] "io" "try" Integer) + ("static" getmtime [String] "io" "try" Float)])]) + +(documentation: /.lambda + (format "Allows defining closures/anonymous-functions in the form that Python expects." + \n "This is useful for adapting Lux functions for usage by Python code.") + [(: ..Function + (lambda [left right] + (do_something (:as Foo left) + (:as Bar right))))]) + +(.def: .public documentation + (.List $.Module) + ($.module /._ + "" + [..import: + ..lambda + ($.default (/.Object brand)) + ($.default /.None) + ($.default /.Dict) + ($.default /.Function) + ($.default /.Boolean) + ($.default /.Integer) + ($.default /.Float) + ($.default /.String)] + [])) diff --git a/stdlib/source/documentation/lux/ffi.rb.lux b/stdlib/source/documentation/lux/ffi.rb.lux index 8f9a93724..33b4ef148 100644 --- a/stdlib/source/documentation/lux/ffi.rb.lux +++ b/stdlib/source/documentation/lux/ffi.rb.lux @@ -39,7 +39,6 @@ ($.default (/.Object brand)) ($.default /.Nil) ($.default /.Function) - ($.default /.Function) ($.default /.Integer) ($.default /.Float) ($.default /.String)] diff --git a/stdlib/source/documentation/lux/world/console.lux b/stdlib/source/documentation/lux/world/console.lux index 97ee7bacf..c091e6d36 100644 --- a/stdlib/source/documentation/lux/world/console.lux +++ b/stdlib/source/documentation/lux/world/console.lux @@ -1,17 +1,18 @@ (.using - [library - [lux "*" - ["$" documentation {"+" documentation:}] - [control - ["<>" parser - ["<[0]>" code]]] - [data - ["[0]" text {"+" \n} - ["%" format {"+" format}]]] - [macro - ["[0]" template]]]] - [\\library - ["[0]" /]]) + [library + [lux "*" + ["$" documentation {"+" documentation:}] + ["@" target] + [control + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]]) (documentation: (/.Console !) "An interface to console/terminal I/O.") @@ -30,14 +31,15 @@ (.def: .public documentation (.List $.Module) - ($.module /._ - "" - [..Console - ..write_line - ..Mock - ..mock - ($.default /.async) - ($.default /.cannot_open) - ($.default /.cannot_close) - ($.default /.default)] - [])) + (`` (`` ($.module /._ + "" + [..Console + ..write_line + ..Mock + ..mock + ($.default /.async) + (~~ (for [@.jvm (~~ (as_is ($.default /.cannot_open) + ($.default /.cannot_close) + ($.default /.default)))] + (~~ (as_is))))] + [])))) diff --git a/stdlib/source/documentation/lux/world/file.lux b/stdlib/source/documentation/lux/world/file.lux index 866ecf959..e2f203abe 100644 --- a/stdlib/source/documentation/lux/world/file.lux +++ b/stdlib/source/documentation/lux/world/file.lux @@ -1,19 +1,20 @@ (.using - [library - [lux "*" - ["$" documentation {"+" documentation:}] - [control - ["<>" parser - ["<[0]>" code]]] - [data - ["[0]" text {"+" \n} - ["%" format {"+" format}]]] - [macro - ["[0]" template]]]] - [\\library - ["[0]" /]] - ["[0]" / "_" - ["[1][0]" watch]]) + [library + [lux "*" + ["$" documentation {"+" documentation:}] + ["@" target] + [control + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]] + ["[0]" / "_" + ["[1][0]" watch]]) (documentation: /.Path "A path to a file or a directory in a file-system.") @@ -53,24 +54,28 @@ (.def: .public documentation (.List $.Module) - ($.module /._ - "" - [..Path - ..System - ..parent - ..name - ..rooted - ..exists? - ..mock - ..make_directories - ..make_file - ($.default /.async) - ($.default /.cannot_make_file) - ($.default /.cannot_find_file) - ($.default /.cannot_delete) - ($.default /.cannot_make_directory) - ($.default /.cannot_find_directory) - ($.default /.cannot_read_all_data) - ($.default /.cannot_modify_file) - ($.default /.default)] - [/watch.documentation])) + (`` (`` ($.module /._ + "" + [..Path + ..System + ..parent + ..name + ..rooted + ..exists? + ..mock + ..make_directories + ..make_file + ($.default /.async) + ($.default /.cannot_make_file) + ($.default /.cannot_find_file) + ($.default /.cannot_delete) + ($.default /.cannot_make_directory) + ($.default /.cannot_find_directory) + ($.default /.cannot_read_all_data) + (~~ (for [@.jvm (~~ (as_is ($.default /.cannot_modify_file) + ($.default /.default))) + @.js (~~ (as_is ($.default /.default))) + @.python (~~ (as_is ($.default /.default))) + @.ruby (~~ (as_is ($.default /.default)))] + (~~ (as_is))))] + [/watch.documentation])))) diff --git a/stdlib/source/documentation/lux/world/file/watch.lux b/stdlib/source/documentation/lux/world/file/watch.lux index 3328fba20..14b9faa0a 100644 --- a/stdlib/source/documentation/lux/world/file/watch.lux +++ b/stdlib/source/documentation/lux/world/file/watch.lux @@ -1,17 +1,18 @@ (.using - [library - [lux "*" - ["$" documentation {"+" documentation:}] - [control - ["<>" parser - ["<[0]>" code]]] - [data - ["[0]" text {"+" \n} - ["%" format {"+" format}]]] - [macro - ["[0]" template]]]] - [\\library - ["[0]" /]]) + [library + [lux "*" + ["$" documentation {"+" documentation:}] + ["@" target] + [control + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]]) (documentation: /.Concern "A particular concern to watch-out for.") @@ -33,26 +34,28 @@ \n "Must be given a path separator for the file-system.") [(mock separator)]) -(documentation: /.default - "The default watcher for the default file-system.") +(for [@.jvm (as_is (documentation: /.default + "The default watcher for the default file-system."))] + (as_is)) (.def: .public documentation (.List $.Module) - ($.module /._ - "" - [..Concern - ..also - ..Watcher - ..polling - ..mock - ..default - ($.default /.creation) - ($.default /.creation?) - ($.default /.modification) - ($.default /.modification?) - ($.default /.deletion) - ($.default /.deletion?) - ($.default /.all) - ($.default /.not_being_watched) - ($.default /.cannot_poll_a_non_existent_directory)] - [])) + (`` (`` ($.module /._ + "" + [..Concern + ..also + ..Watcher + ..polling + ..mock + ($.default /.creation) + ($.default /.creation?) + ($.default /.modification) + ($.default /.modification?) + ($.default /.deletion) + ($.default /.deletion?) + ($.default /.all) + ($.default /.not_being_watched) + ($.default /.cannot_poll_a_non_existent_directory) + (~~ (for [@.jvm (~~ (as_is ..default))] + (~~ (as_is))))] + [])))) diff --git a/stdlib/source/documentation/lux/world/net/http/client.lux b/stdlib/source/documentation/lux/world/net/http/client.lux index d3124090c..a11e8a0bb 100644 --- a/stdlib/source/documentation/lux/world/net/http/client.lux +++ b/stdlib/source/documentation/lux/world/net/http/client.lux @@ -1,17 +1,18 @@ (.using - [library - [lux "*" - ["$" documentation {"+" documentation:}] - [control - ["<>" parser - ["<[0]>" code]]] - [data - ["[0]" text {"+" \n} - ["%" format {"+" format}]]] - [macro - ["[0]" template]]]] - [\\library - ["[0]" /]]) + [library + [lux "*" + ["$" documentation {"+" documentation:}] + ["@" target] + [control + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]]) (documentation: (/.Client !) "A HTTP client capable of issuing requests to a HTTP server.") @@ -29,26 +30,24 @@ [/.connect] [/.options] [/.trace] - [/.default] - [/.async] - [/.headers] ) (.def: .public documentation (.List $.Module) - ($.module /._ - "" - [..Client - ..post - ..get - ..put - ..patch - ..delete - ..head - ..connect - ..options - ..trace - ..default - ..async - ..headers] - [])) + (`` (`` ($.module /._ + "" + [..Client + ..post + ..get + ..put + ..patch + ..delete + ..head + ..connect + ..options + ..trace + ($.default /.async) + ($.default /.headers) + (~~ (for [@.jvm (~~ (as_is ($.default /.default)))] + (~~ (as_is))))] + [])))) diff --git a/stdlib/source/documentation/lux/world/shell.lux b/stdlib/source/documentation/lux/world/shell.lux index 9b283f847..0a39e0c6a 100644 --- a/stdlib/source/documentation/lux/world/shell.lux +++ b/stdlib/source/documentation/lux/world/shell.lux @@ -1,17 +1,18 @@ (.using - [library - [lux "*" - ["$" documentation {"+" documentation:}] - [control - ["<>" parser - ["<[0]>" code]]] - [data - ["[0]" text {"+" \n} - ["%" format {"+" format}]]] - [macro - ["[0]" template]]]] - [\\library - ["[0]" /]]) + [library + [lux "*" + ["$" documentation {"+" documentation:}] + ["@" target] + [control + ["<>" parser + ["<[0]>" code]]] + [data + ["[0]" text {"+" \n} + ["%" format {"+" format}]]] + [macro + ["[0]" template]]]] + [\\library + ["[0]" /]]) (documentation: /.Exit "A program exit code.") @@ -37,18 +38,19 @@ (.def: .public documentation (.List $.Module) - ($.module /._ - "" - [..Exit - ..Process - ..Command - ..Argument - ..Shell - ..Mock - ..mock - ($.default /.normal) - ($.default /.error) - ($.default /.async) - ($.default /.no_more_output) - ($.default /.default)] - [])) + (`` (`` ($.module /._ + "" + [..Exit + ..Process + ..Command + ..Argument + ..Shell + ..Mock + ..mock + ($.default /.normal) + ($.default /.error) + ($.default /.async) + (~~ (for [@.jvm (~~ (as_is ($.default /.no_more_output) + ($.default /.default)))] + (~~ (as_is))))] + [])))) diff --git a/stdlib/source/library/lux/debug.lux b/stdlib/source/library/lux/debug.lux index 132fff652..923919c16 100644 --- a/stdlib/source/library/lux/debug.lux +++ b/stdlib/source/library/lux/debug.lux @@ -1,45 +1,45 @@ (.using - [library - [lux {"-" type private} - ["@" target] - ["[0]" type] - ["[0]" ffi {"+" import:}] - ["[0]" meta] - [abstract - ["[0]" monad {"+" do}]] - [control - [pipe {"+" new>}] - ["[0]" function] - ["[0]" try {"+" Try}] - ["[0]" exception {"+" exception:}] - ["<>" parser - ["<[0]>" type {"+" Parser}] - ["<[0]>" code]]] - [data - ["[0]" text - ["%" format {"+" Format}]] - [format - [xml {"+" XML}] - ["[0]" json]] - [collection - ["[0]" array] - ["[0]" list ("[1]#[0]" functor)] - ["[0]" dictionary]]] - [macro - ["[0]" template] - ["[0]" syntax {"+" syntax:}] - ["[0]" code]] - [math - [number - [ratio {"+" Ratio}] - ["n" nat] - ["i" int]]] - [time {"+" Time} - [instant {"+" Instant}] - [duration {"+" Duration}] - [date {"+" Date}] - [month {"+" Month}] - [day {"+" Day}]]]]) + [library + [lux {"-" type private} + ["@" target] + ["[0]" type] + ["[0]" ffi {"+" import:}] + ["[0]" meta] + [abstract + ["[0]" monad {"+" do}]] + [control + [pipe {"+" new>}] + ["[0]" function] + ["[0]" try {"+" Try}] + ["[0]" exception {"+" exception:}] + ["<>" parser + ["<[0]>" type {"+" Parser}] + ["<[0]>" code]]] + [data + ["[0]" text + ["%" format {"+" Format}]] + [format + [xml {"+" XML}] + ["[0]" json]] + [collection + ["[0]" array] + ["[0]" list ("[1]#[0]" functor)] + ["[0]" dictionary]]] + [macro + ["[0]" template] + ["[0]" syntax {"+" syntax:}] + ["[0]" code]] + [math + [number + [ratio {"+" Ratio}] + ["n" nat] + ["i" int]]] + [time {"+" Time} + [instant {"+" Instant}] + [duration {"+" Duration}] + [date {"+" Date}] + [month {"+" Month}] + [day {"+" Day}]]]]) (with_expansions [<jvm> (as_is (import: java/lang/String) diff --git a/stdlib/source/library/lux/ffi.js.lux b/stdlib/source/library/lux/ffi.js.lux index cfc38cc24..ece090ecd 100644 --- a/stdlib/source/library/lux/ffi.js.lux +++ b/stdlib/source/library/lux/ffi.js.lux @@ -1,6 +1,6 @@ (.using [library - [lux "*" + [lux {"-" Symbol} ["[0]" meta] [abstract [monad {"+" do}]] @@ -244,7 +244,7 @@ (function (_ member_name) (|> format (text.replaced "[1]" class_name) - (text.replaced "." member_name) + (text.replaced "[0]" member_name) code.local_symbol))) class_parameters (list#each code.local_symbol class_parameters) declaration (` ((~ (code.local_symbol class_name)) diff --git a/stdlib/source/library/lux/ffi.lua.lux b/stdlib/source/library/lux/ffi.lua.lux index 346519334..1a99178cd 100644 --- a/stdlib/source/library/lux/ffi.lua.lux +++ b/stdlib/source/library/lux/ffi.lua.lux @@ -1,27 +1,27 @@ (.using - [library - [lux "*" - ["@" target] - ["[0]" meta] - [abstract - [monad {"+" do}]] - [control - ["[0]" io] - ["[0]" maybe] - ["<>" parser ("[1]#[0]" monad) - ["<[0]>" code {"+" Parser}]]] - [data - ["[0]" product] - ["[0]" text - ["%" format]] - [collection - ["[0]" list ("[1]#[0]" functor mix)]]] - [type - abstract] - [macro {"+" with_symbols} - [syntax {"+" syntax:}] - ["[0]" code] - ["[0]" template]]]]) + [library + [lux "*" + ["@" target] + ["[0]" meta] + [abstract + [monad {"+" do}]] + [control + ["[0]" io] + ["[0]" maybe] + ["<>" parser ("[1]#[0]" monad) + ["<[0]>" code {"+" Parser}]]] + [data + ["[0]" product] + ["[0]" text + ["%" format]] + [collection + ["[0]" list ("[1]#[0]" functor mix)]]] + [type + abstract] + [macro {"+" with_symbols} + [syntax {"+" syntax:}] + ["[0]" code] + ["[0]" template]]]]) (abstract: .public (Object brand) Any) @@ -217,8 +217,6 @@ (~+ (list#each (with_nil g!temp) g!inputs))))))))))) (syntax: .public (import: [import ..import]) - ... {.#doc (example "Easily import types, methods, functions and constants." - ... (import: (os/getenv [..String] "io" "?" ..String)))} (with_symbols [g!temp] (case import {#Class [class format members]} @@ -309,11 +307,6 @@ ))) (template: .public (closure <inputs> <output>) - ... {.#doc (example "Allows defining closures/anonymous-functions in the form that Lua expects." - ... "This is useful for adapting Lux functions for usage by Lua code." - ... (: ..Function - ... (closure [left right] - ... (do_something (:as Foo left) (:as Bar right)))))} [(.:as ..Function (`` ("lua function" (~~ (template.amount <inputs>)) diff --git a/stdlib/source/library/lux/ffi.py.lux b/stdlib/source/library/lux/ffi.py.lux index e35da749c..4cb39155c 100644 --- a/stdlib/source/library/lux/ffi.py.lux +++ b/stdlib/source/library/lux/ffi.py.lux @@ -217,28 +217,6 @@ (~+ (list#each (with_none g!temp) g!inputs))))))))))) (syntax: .public (import: [import ..import]) - ... {.#doc (example "Easily import types, methods, functions and constants." - ... (import: os - ... ["[1]::[0]" - ... ("static" F_OK ..Integer) - ... ("static" R_OK ..Integer) - ... ("static" W_OK ..Integer) - ... ("static" X_OK ..Integer) - - ... ("static" mkdir [..String] "io" "try" "?" Any) - ... ("static" access [..String ..Integer] "io" "try" ..Boolean) - ... ("static" remove [..String] "io" "try" "?" Any) - ... ("static" rmdir [..String] "io" "try" "?" Any) - ... ("static" rename [..String ..String] "io" "try" "?" Any) - ... ("static" listdir [..String] "io" "try" (Array ..String))]) - - ... (import: os/path - ... ["[1]::[0]" - ... ("static" isfile [..String] "io" "try" ..Boolean) - ... ("static" isdir [..String] "io" "try" ..Boolean) - ... ("static" sep ..String) - ... ("static" getsize [..String] "io" "try" ..Integer) - ... ("static" getmtime [..String] "io" "try" ..Float)]))} (with_symbols [g!temp] (case import {#Class [class format members]} @@ -334,11 +312,6 @@ ))) (template: .public (lambda <inputs> <output>) - ... {.#doc (example "Allows defining closures/anonymous-functions in the form that Python expects." - ... "This is useful for adapting Lux functions for usage by Python code." - ... (: ..Function - ... (lambda [left right] - ... (do_something (:as Foo left) (:as Bar right)))))} [(.:as ..Function (`` ("python function" (~~ (template.amount <inputs>)) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/case.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/case.lux index c44b73500..c21dc12ec 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/case.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/case.lux @@ -80,7 +80,7 @@ (in (list#mix (function (_ side source) (.let [method (.case side (^template [<side> <accessor>] - [(<side> lefts) + [{<side> lefts} (<accessor> (_.i32 (.int lefts)))]) ([.#Left //runtime.tuple//left] [.#Right //runtime.tuple//right]))] @@ -131,11 +131,12 @@ (_.statement (|> @cursor (_.do "splice" (list (|> @cursor ..length (_.- popsJS)) popsJS)))))) -(template [<name> <flag> <prep>] +(template [<name> <flag>] [(def: (<name> simple? idx) (-> Bit Nat Statement) ($_ _.then - (_.set @temp (|> idx <prep> .int _.i32 (//runtime.sum//get ..peek_cursor <flag>))) + (_.set @temp (//runtime.sum//get ..peek_cursor <flag> + (|> idx .int _.i32))) (.if simple? (_.when (_.= _.null @temp) ..fail_pm!) @@ -143,8 +144,8 @@ ..fail_pm! (push_cursor! @temp)))))] - [left_choice _.null (<|)] - [right_choice (_.string "") ++] + [left_choice _.null] + [right_choice //runtime.unit] ) (def: (alternation pre! post!) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/reference.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/reference.lux index 25dab5ed7..0874ed4f3 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/reference.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/reference.lux @@ -9,5 +9,5 @@ (implementation: .public system (System Expression) - (def: constant _.var) - (def: variable _.var)) + (def: constant' _.var) + (def: variable' _.var)) diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux index 766d7e940..1fdba6ac2 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/runtime.lux @@ -190,38 +190,35 @@ (-> Expression Expression Expression Computation) (_.new ..variant//new (list 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? - ... 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))] +(runtime: (sum//get sum expected##right? expected##lefts) + (let [mismatch! (_.return _.null) + actual##lefts (|> sum (_.the ..variant_tag_field)) + actual##right? (|> sum (_.the ..variant_flag_field)) + actual##value (|> sum (_.the ..variant_value_field)) + is_last? (_.= ..unit actual##right?) + recur! ($_ _.then + (_.set expected##lefts (|> expected##lefts + (_.- actual##lefts) + (_.- (_.i32 +1)))) + (_.set sum actual##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!] - [(_.= ..unit wants_last) - extrac_sub_variant!]) - no_match!)))) - -(def: none - Computation - (..variant (_.i32 +0) (flag #0) unit)) - -(def: some - (-> Expression Computation) - (..variant (_.i32 +1) (flag #1))) + (_.cond (list [(_.= expected##lefts actual##lefts) + (_.if (_.= expected##right? actual##right?) + (_.return actual##value) + mismatch!)] + + [(_.< expected##lefts actual##lefts) + (_.if (_.= ..unit actual##right?) + recur! + mismatch!)] + + [(_.= ..unit expected##right?) + (_.return (..variant (|> actual##lefts + (_.- expected##lefts) + (_.- (_.i32 +1))) + actual##right? + actual##value))]) + mismatch!)))) (def: left (-> Expression Computation) @@ -229,7 +226,15 @@ (def: right (-> Expression Computation) - (..variant (_.i32 +1) (flag #1))) + (..variant (_.i32 +0) (flag #1))) + +(def: none + Computation + (..left ..unit)) + +(def: some + (-> Expression Computation) + ..right) (def: runtime//structure Statement diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/structure.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/structure.lux index 6629816d0..9aefc6a48 100644 --- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/structure.lux +++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js/structure.lux @@ -1,18 +1,18 @@ (.using - [library - [lux {"-" Variant Tuple} - [abstract - ["[0]" monad {"+" do}]] - [target - ["_" js {"+" Expression}]]]] - ["[0]" // "_" - ["[1][0]" runtime {"+" Operation Phase Generator}] - ["[1][0]" primitive] - ["///[1]" //// "_" - [analysis {"+" Variant Tuple}] - ["[1][0]" synthesis {"+" Synthesis}] - ["//[1]" /// - ["[1][0]" phase ("[1]#[0]" monad)]]]]) + [library + [lux {"-" Variant Tuple} + [abstract + ["[0]" monad {"+" do}]] + [target + ["_" js {"+" Expression}]]]] + ["[0]" // "_" + ["[1][0]" runtime {"+" Operation Phase Generator}] + ["[1][0]" primitive] + ["///[1]" //// "_" + [analysis {"+" Variant Tuple}] + ["[1][0]" synthesis {"+" Synthesis}] + ["//[1]" /// + ["[1][0]" phase ("[1]#[0]" monad)]]]]) (def: .public (tuple generate archive elemsS+) (Generator (Tuple Synthesis)) @@ -30,9 +30,6 @@ (def: .public (variant generate archive [lefts right? valueS]) (Generator (Variant Synthesis)) - (let [tag (if right? - (++ lefts) - lefts)] - (///////phase#each (//runtime.variant (_.i32 (.int tag)) - (//runtime.flag right?)) - (generate archive valueS)))) + (///////phase#each (//runtime.variant (_.i32 (.int lefts)) + (//runtime.flag right?)) + (generate archive valueS))) |