aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands5
-rw-r--r--stdlib/source/lux/control/concurrency/atom.lux8
-rw-r--r--stdlib/source/lux/control/concurrency/process.lux8
-rw-r--r--stdlib/source/lux/control/parser/cli.lux11
-rw-r--r--stdlib/source/lux/control/thread.lux8
-rw-r--r--stdlib/source/lux/data/collection/array.lux28
-rw-r--r--stdlib/source/lux/data/collection/list.lux8
-rw-r--r--stdlib/source/lux/data/collection/row.lux6
-rw-r--r--stdlib/source/lux/data/text.lux28
-rw-r--r--stdlib/source/lux/data/text/encoding.lux21
-rw-r--r--stdlib/source/lux/math.lux8
-rw-r--r--stdlib/source/lux/target.lux (renamed from stdlib/source/lux/tool/compiler/host.lux)0
-rw-r--r--stdlib/source/lux/tool/compiler/default/init.lux22
-rw-r--r--stdlib/source/lux/tool/compiler/phase/extension/analysis.lux6
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux7
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/lua/function.lux4
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/lua/loop.lux2
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/lua/runtime.lux3
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/php/runtime.lux3
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/python/case.lux2
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/python/function.lux4
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/python/loop.lux2
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux5
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/ruby/runtime.lux3
-rw-r--r--stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.lux3
-rw-r--r--stdlib/source/lux/world/file.lux377
-rw-r--r--stdlib/source/lux/world/net/tcp.old.lux190
-rw-r--r--stdlib/source/lux/world/net/udp.old.lux160
28 files changed, 465 insertions, 467 deletions
diff --git a/commands b/commands
index 5a726b4c6..5e3bcb224 100644
--- a/commands
+++ b/commands
@@ -6,7 +6,10 @@ cd ~/lux/luxc/ && lein clean && \
cd ~/lux/stdlib/ && lein clean && \
cd ~/lux/new-luxc/ && lein clean && \
cd ~/lux/lux-js/ && lein clean && \
-cd ~/lux/lux-python/ && lein clean
+cd ~/lux/lux-python/ && lein clean && \
+cd ~/lux/lux-lua/ && lein clean && \
+cd ~/lux/lux-ruby/ && lein clean && \
+cd ~/lux/lux-php/ && lein clean
# Old Lux compiler
# Re-build and re-install
diff --git a/stdlib/source/lux/control/concurrency/atom.lux b/stdlib/source/lux/control/concurrency/atom.lux
index 4de104212..cb252066a 100644
--- a/stdlib/source/lux/control/concurrency/atom.lux
+++ b/stdlib/source/lux/control/concurrency/atom.lux
@@ -1,16 +1,14 @@
(.module:
[lux #*
+ [host (#+ import:)]
+ ["@" target]
[abstract
[monad (#+ do)]]
[control
["." function]
["." io (#- run)]]
[type
- abstract]
- [tool
- [compiler
- ["@" host]]]
- [host (#+ import:)]])
+ abstract]])
(`` (for {(~~ (static @.old))
(import: #long (java/util/concurrent/atomic/AtomicReference a)
diff --git a/stdlib/source/lux/control/concurrency/process.lux b/stdlib/source/lux/control/concurrency/process.lux
index 074ea96ac..400dcf2c8 100644
--- a/stdlib/source/lux/control/concurrency/process.lux
+++ b/stdlib/source/lux/control/concurrency/process.lux
@@ -1,5 +1,7 @@
(.module:
[lux #*
+ ["@" target]
+ ["." host (#+ import: object)]
[abstract
["." monad (#+ do)]]
[control
@@ -7,11 +9,7 @@
["." io (#+ IO io)]]
[data
[collection
- ["." list]]]
- [tool
- [compiler
- ["@" host]]]
- ["." host (#+ import: object)]]
+ ["." list]]]]
[//
["." atom (#+ Atom)]])
diff --git a/stdlib/source/lux/control/parser/cli.lux b/stdlib/source/lux/control/parser/cli.lux
index 38f22602f..e1e932569 100644
--- a/stdlib/source/lux/control/parser/cli.lux
+++ b/stdlib/source/lux/control/parser/cli.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
[monad (#+ do)]]
[data
@@ -10,10 +11,7 @@
["." error (#+ Error)]]
[macro (#+ with-gensyms)
["." code]
- [syntax (#+ syntax:)]]
- [tool
- [compiler
- ["." host]]]]
+ [syntax (#+ syntax:)]]]
["." //
["s" code]
[//
@@ -161,7 +159,10 @@
(~ g!_) ..end]
((~' wrap) ((~! do) (~! io.monad)
[(~ g!output) (~ body)
- (~+ (`` (for {(~~ (static host.old))
+ (~+ (`` (for {(~~ (static @.old))
+ (list)
+
+ (~~ (static @.jvm))
(list)}
(list g!_
(` process.run!)))))]
diff --git a/stdlib/source/lux/control/thread.lux b/stdlib/source/lux/control/thread.lux
index db351d87b..ec9650664 100644
--- a/stdlib/source/lux/control/thread.lux
+++ b/stdlib/source/lux/control/thread.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
[functor (#+ Functor)]
[apply (#+ Apply)]
@@ -10,10 +11,7 @@
[collection
["." array (#+ Array)]]]
[type
- abstract]
- [tool
- [compiler
- ["." host]]]])
+ abstract]])
(type: #export (Thread ! a)
(-> ! a))
@@ -33,7 +31,7 @@
(def: #export (read box)
(All [! a] (-> (Box ! a) (Thread ! a)))
(function (_ !)
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
("jvm aaload" (:representation box) 0)}))))
(def: #export (write value box)
diff --git a/stdlib/source/lux/data/collection/array.lux b/stdlib/source/lux/data/collection/array.lux
index d73ca2e7f..aeb0cc55f 100644
--- a/stdlib/source/lux/data/collection/array.lux
+++ b/stdlib/source/lux/data/collection/array.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
[monoid (#+ Monoid)]
[functor (#+ Functor)]
@@ -10,10 +11,7 @@
["." product]
["." maybe]
[collection
- ["." list ("#@." fold)]]]
- [tool
- [compiler
- ["." host]]]])
+ ["." list ("#@." fold)]]]])
(def: #export type-name "#Array")
@@ -24,7 +22,7 @@
(with-expansions [<index-type> (primitive "java.lang.Long")
<elem-type> (primitive "java.lang.Object")
<array-type> (type (Array <elem-type>))]
- (`` (for {(~~ (static host.jvm))
+ (`` (for {(~~ (static @.jvm))
(template: (!int value)
(|> value
(:coerce <index-type>)
@@ -34,10 +32,10 @@
(def: #export (new size)
(All [a] (-> Nat (Array a)))
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
(:assume ("jvm anewarray" "(java.lang.Object )" size))
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(|> size
!int
"jvm array new"
@@ -46,10 +44,10 @@
(def: #export (size array)
(All [a] (-> (Array a) Nat))
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
("jvm arraylength" array)
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(|> array
(:coerce <array-type>)
"jvm array length"
@@ -62,13 +60,13 @@
(All [a]
(-> Nat (Array a) (Maybe a)))
(if (n/< (size array) index)
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
(let [value ("jvm aaload" array index)]
(if ("jvm object null?" value)
#.None
(#.Some value)))
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(let [value (|> array
(:coerce <array-type>)
("jvm array read" (!int index)))]
@@ -80,10 +78,10 @@
(def: #export (write index value array)
(All [a]
(-> Nat a (Array a) (Array a)))
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
("jvm aastore" array index value)
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(|> array
(:coerce <array-type>)
("jvm array write" (!int index) (:coerce <elem-type> value))
@@ -93,10 +91,10 @@
(All [a]
(-> Nat (Array a) (Array a)))
(if (n/< (size array) index)
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
(write index (:assume ("jvm object null")) array)
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(write index (:assume (: <elem-type> ("jvm object null"))) array)}))
array))
)
diff --git a/stdlib/source/lux/data/collection/list.lux b/stdlib/source/lux/data/collection/list.lux
index fa18cfd19..ff6739076 100644
--- a/stdlib/source/lux/data/collection/list.lux
+++ b/stdlib/source/lux/data/collection/list.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
[monoid (#+ Monoid)]
["." functor (#+ Functor)]
@@ -10,10 +11,7 @@
[predicate (#+ Predicate)]]
[data
["." bit]
- ["." product]]
- [tool
- [compiler
- ["." host]]]])
+ ["." product]]])
## (type: (List a)
## #Nil
@@ -554,7 +552,7 @@
(do monad
[lMla MlMla
## TODO: Remove this version ASAP and use one below.
- lla (`` (for {(~~ (static host.old))
+ lla (`` (for {(~~ (static @.old))
(: (($ 0) (List (List ($ 1))))
(monad.seq @ lMla))}
(monad.seq @ lMla)))]
diff --git a/stdlib/source/lux/data/collection/row.lux b/stdlib/source/lux/data/collection/row.lux
index 722526e26..71bb5202a 100644
--- a/stdlib/source/lux/data/collection/row.lux
+++ b/stdlib/source/lux/data/collection/row.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
[functor (#+ Functor)]
[apply (#+ Apply)]
@@ -21,10 +22,7 @@
["." array (#+ Array) ("#@." functor fold)]]]
[macro (#+ with-gensyms)
["." code]
- [syntax (#+ syntax:)]]
- [tool
- [compiler
- ["@" host]]]])
+ [syntax (#+ syntax:)]]])
(type: (Node a)
(#Base (Array a))
diff --git a/stdlib/source/lux/data/text.lux b/stdlib/source/lux/data/text.lux
index df3dad17e..856481560 100644
--- a/stdlib/source/lux/data/text.lux
+++ b/stdlib/source/lux/data/text.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
hash
[monoid (#+ Monoid)]
@@ -12,10 +13,7 @@
[number
["." i64]]
[collection
- ["." list ("#@." fold)]]]
- [tool
- [compiler
- ["." host]]]])
+ ["." list ("#@." fold)]]]])
(type: #export Char Nat)
@@ -89,10 +87,10 @@
(-> Text Text Bit)
(case (index-of prefix x)
(#.Some 0)
- #1
+ true
_
- #0))
+ false))
(def: #export (ends-with? postfix x)
(-> Text Text Bit)
@@ -102,16 +100,16 @@
(n/+ (size postfix) n))
_
- #0))
+ false))
(def: #export (contains? sub text)
(-> Text Text Bit)
(case ("lux text index" 0 sub text)
(#.Some _)
- #1
+ true
_
- #0))
+ false))
(def: #export (clip from to input)
(-> Nat Nat Text (Maybe Text))
@@ -189,14 +187,14 @@
(def: &equivalence ..equivalence)
(def: (hash input)
- (`` (for {(~~ (static host.old))
+ (`` (for {(~~ (static @.old))
(|> input
(: (primitive "java.lang.String" []))
"jvm invokevirtual:java.lang.String:hashCode:"
"jvm convert int-to-long"
(:coerce Nat))
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(|> input
(:coerce (primitive "java.lang.String"))
("jvm member invoke virtual" "java.lang.String" "hashCode")
@@ -228,8 +226,8 @@
(def: #export (empty? text)
(-> Text Bit)
(case text
- "" #1
- _ #0))
+ "" true
+ _ false))
(def: #export (prefix param subject)
(-> Text Text Text)
@@ -263,7 +261,7 @@
(^ (char (~~ (static ..new-line))))
(^ (char (~~ (static ..carriage-return))))
(^ (char (~~ (static ..form-feed)))))
- #1
+ true
_
- #0)))
+ false)))
diff --git a/stdlib/source/lux/data/text/encoding.lux b/stdlib/source/lux/data/text/encoding.lux
index aae640382..470265081 100644
--- a/stdlib/source/lux/data/text/encoding.lux
+++ b/stdlib/source/lux/data/text/encoding.lux
@@ -1,5 +1,6 @@
(.module:
[lux #*
+ ["@" target]
[abstract
[codec (#+ Codec)]]
[data
@@ -8,9 +9,6 @@
abstract]
[world
[binary (#+ Binary)]]
- [tool
- [compiler
- ["_" host]]]
[host (#+ import:)]])
## https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html
@@ -173,19 +171,30 @@
(|>> :representation))
)
-(`` (for {(~~ (static _.old))
+(`` (for {(~~ (static @.old))
+ (as-is (import: #long java/lang/String
+ (new [(Array byte) java/lang/String])
+ (getBytes [java/lang/String] (Array byte))))
+
+ (~~ (static @.jvm))
(as-is (import: #long java/lang/String
(new [(Array byte) java/lang/String])
(getBytes [java/lang/String] (Array byte))))}))
(def: #export (to-utf8 value)
(-> Text Binary)
- (`` (for {(~~ (static _.old))
+ (`` (for {(~~ (static @.old))
+ (java/lang/String::getBytes (..name ..utf-8) (:coerce java/lang/String value))
+
+ (~~ (static @.jvm))
(java/lang/String::getBytes (..name ..utf-8) (:coerce java/lang/String value))})))
(def: #export (from-utf8 value)
(-> Binary (Error Text))
- (`` (for {(~~ (static _.old))
+ (`` (for {(~~ (static @.old))
+ (#error.Success (java/lang/String::new value (..name ..utf-8)))
+
+ (~~ (static @.jvm))
(#error.Success (java/lang/String::new value (..name ..utf-8)))})))
(structure: #export UTF-8 (Codec Binary Text)
diff --git a/stdlib/source/lux/math.lux b/stdlib/source/lux/math.lux
index 3916622cf..712e2bf70 100644
--- a/stdlib/source/lux/math.lux
+++ b/stdlib/source/lux/math.lux
@@ -1,8 +1,6 @@
(.module: {#.doc "Common mathematical constants and functions."}
[lux #*
- [tool
- [compiler
- ["." host]]]])
+ ["@" target]])
(template [<name> <value> <doc>]
[(def: #export <name>
@@ -15,7 +13,7 @@
[tau +6.28318530717958647692 "The ratio of a circle's circumference to its radius."]
)
-(`` (for {(~~ (static host.old))
+(`` (for {(~~ (static @.old))
(as-is (template [<name> <method>]
[(def: #export (<name> input)
(-> Frac Frac)
@@ -39,7 +37,7 @@
(-> Frac Frac Frac)
("jvm invokestatic:java.lang.Math:pow:double,double" subject param)))
- (~~ (static host.jvm))
+ (~~ (static @.jvm))
(as-is (template: (!double value) (|> value (:coerce (primitive "java.lang.Double")) "jvm object cast"))
(template: (!frac value) (|> value "jvm object cast" (: (primitive "java.lang.Double")) (:coerce Frac)))
(template [<name> <method>]
diff --git a/stdlib/source/lux/tool/compiler/host.lux b/stdlib/source/lux/target.lux
index 06c4c7efe..06c4c7efe 100644
--- a/stdlib/source/lux/tool/compiler/host.lux
+++ b/stdlib/source/lux/target.lux
diff --git a/stdlib/source/lux/tool/compiler/default/init.lux b/stdlib/source/lux/tool/compiler/default/init.lux
index 604fd8551..5cb857d65 100644
--- a/stdlib/source/lux/tool/compiler/default/init.lux
+++ b/stdlib/source/lux/tool/compiler/default/init.lux
@@ -1,5 +1,6 @@
(.module:
[lux (#- Module)
+ ["@" target]
[type (#+ :share)]
[abstract
["." monad (#+ do)]]
@@ -24,7 +25,6 @@
["#." analysis]
["#." synthesis]
["#." statement (#+ Requirements)]
- ["#." host]
["#." phase
[macro (#+ Expander)]
[".P" analysis
@@ -45,16 +45,16 @@
(def: #export info
Info
- {#.target (`` (for {(~~ (static ///host.common-lisp)) ///host.common-lisp
- (~~ (static ///host.js)) ///host.js
- (~~ (static ///host.old)) ///host.jvm
- (~~ (static ///host.jvm)) ///host.jvm
- (~~ (static ///host.lua)) ///host.lua
- (~~ (static ///host.php)) ///host.php
- (~~ (static ///host.python)) ///host.python
- (~~ (static ///host.r)) ///host.r
- (~~ (static ///host.ruby)) ///host.ruby
- (~~ (static ///host.scheme)) ///host.scheme}))
+ {#.target (`` (for {(~~ (static @.common-lisp)) @.common-lisp
+ (~~ (static @.js)) @.js
+ (~~ (static @.old)) @.jvm
+ (~~ (static @.jvm)) @.jvm
+ (~~ (static @.lua)) @.lua
+ (~~ (static @.php)) @.php
+ (~~ (static @.python)) @.python
+ (~~ (static @.r)) @.r
+ (~~ (static @.ruby)) @.ruby
+ (~~ (static @.scheme)) @.scheme}))
#.version //.version
#.mode #.Build})
diff --git a/stdlib/source/lux/tool/compiler/phase/extension/analysis.lux b/stdlib/source/lux/tool/compiler/phase/extension/analysis.lux
index 446e769f1..ca2d75e4d 100644
--- a/stdlib/source/lux/tool/compiler/phase/extension/analysis.lux
+++ b/stdlib/source/lux/tool/compiler/phase/extension/analysis.lux
@@ -1,11 +1,9 @@
(.`` (.module:
[lux #*
+ ["@" target]
[data
[collection
- ["." dictionary]]]
- [tool
- [compiler
- ["@" host]]]]
+ ["." dictionary]]]]
[////
[default
[evaluation (#+ Eval)]]
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux
index c94b68337..314fe300d 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/js/runtime.lux
@@ -739,7 +739,8 @@
(Operation Any)
(///.with-buffer
(do ////.monad
- [_ (///.save! ["" ..prefix] ($_ _.then
- _.use-strict
- ..runtime))]
+ [_ (///.save! true ["" ..prefix]
+ ($_ _.then
+ _.use-strict
+ ..runtime))]
(///.save-buffer! ..artifact))))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/lua/function.lux b/stdlib/source/lux/tool/compiler/phase/generation/lua/function.lux
index 517af6550..9fa8a3c7d 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/lua/function.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/lua/function.lux
@@ -39,14 +39,14 @@
(case inits
#.Nil
(do ////.monad
- [_ (///.save! ["" function-name]
+ [_ (///.save! true ["" function-name]
function-definition)]
(wrap (|> (_.var function-name) (_.apply/* inits))))
_
(do ////.monad
[@closure (:: @ map _.var (///.gensym "closure"))
- _ (///.save! ["" (_.code @closure)]
+ _ (///.save! true ["" (_.code @closure)]
(_.function @closure
(|> (list.enumerate inits)
(list@map (|>> product.left ..capture)))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/lua/loop.lux b/stdlib/source/lux/tool/compiler/phase/generation/lua/loop.lux
index 41ebb4766..39c983dcc 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/lua/loop.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/lua/loop.lux
@@ -25,7 +25,7 @@
initsO+ (monad.map @ generate initsS+)
bodyO (///.with-anchor @loop
(generate bodyS))
- _ (///.save! ["" (_.code @loop)]
+ _ (///.save! true ["" (_.code @loop)]
(_.function @loop (|> initsS+
list.enumerate
(list@map (|>> product.left (n/+ start) //case.register)))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/lua/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/lua/runtime.lux
index 6eeddc5ff..57f8e11df 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/lua/runtime.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/lua/runtime.lux
@@ -358,5 +358,6 @@
(Operation Any)
(///.with-buffer
(do ////.monad
- [_ (///.save! ["" ..prefix] ..runtime)]
+ [_ (///.save! true ["" ..prefix]
+ ..runtime)]
(///.save-buffer! ..artifact))))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/php/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/php/runtime.lux
index e29b7622a..8d3a2138a 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/php/runtime.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/php/runtime.lux
@@ -301,5 +301,6 @@
(Operation Any)
(///.with-buffer
(do ////.monad
- [_ (///.save! true ["" ..prefix] ..runtime)]
+ [_ (///.save! true ["" ..prefix]
+ ..runtime)]
(///.save-buffer! ..artifact))))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/python/case.lux b/stdlib/source/lux/tool/compiler/phase/generation/python/case.lux
index 3aa95d673..dc908eae7 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/python/case.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/python/case.lux
@@ -230,7 +230,7 @@
(#reference.Foreign register)
(..capture register)))))]
- _ (///.save! ["" (_.code @case)]
+ _ (///.save! true ["" (_.code @case)]
(_.def @case (list& @init @dependencies+)
($_ _.then
(_.set (list @cursor) (_.list (list @init)))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/python/function.lux b/stdlib/source/lux/tool/compiler/phase/generation/python/function.lux
index a5f918dc1..2631f629c 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/python/function.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/python/function.lux
@@ -39,14 +39,14 @@
(case inits
#.Nil
(do ////.monad
- [_ (///.save! ["" function-name]
+ [_ (///.save! true ["" function-name]
function-definition)]
(wrap (_.apply/* (_.var function-name) inits)))
_
(do ////.monad
[@closure (:: @ map _.var (///.gensym "closure"))
- _ (///.save! ["" (_.code @closure)]
+ _ (///.save! true ["" (_.code @closure)]
(_.def @closure
(|> (list.enumerate inits)
(list@map (|>> product.left ..capture)))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/python/loop.lux b/stdlib/source/lux/tool/compiler/phase/generation/python/loop.lux
index 12d83b756..9dae1b6dc 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/python/loop.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/python/loop.lux
@@ -25,7 +25,7 @@
initsO+ (monad.map @ generate initsS+)
bodyO (///.with-anchor @loop
(generate bodyS))
- _ (///.save! ["" (_.code @loop)]
+ _ (///.save! true ["" (_.code @loop)]
(_.def @loop (|> initsS+
list.enumerate
(list@map (|>> product.left (n/+ start) //case.register)))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux
index 44b9d290f..b2135a625 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/python/runtime.lux
@@ -364,6 +364,7 @@
(Operation Any)
(///.with-buffer
(do ////.monad
- [_ (///.save! ["" ..prefix] (<| (_.comment "-*- coding: utf-8 -*-")
- ..runtime))]
+ [_ (///.save! true ["" ..prefix]
+ (<| (_.comment "-*- coding: utf-8 -*-")
+ ..runtime))]
(///.save-buffer! ..artifact))))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/ruby/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/ruby/runtime.lux
index 8858e9d4f..b63571ddc 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/ruby/runtime.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/ruby/runtime.lux
@@ -290,5 +290,6 @@
(Operation Any)
(///.with-buffer
(do ////.monad
- [_ (///.save! ["" ..prefix] ..runtime)]
+ [_ (///.save! true ["" ..prefix]
+ ..runtime)]
(///.save-buffer! ..artifact))))
diff --git a/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.lux b/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.lux
index bda2f7783..c22906d2d 100644
--- a/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.lux
+++ b/stdlib/source/lux/tool/compiler/phase/generation/scheme/runtime.lux
@@ -319,5 +319,6 @@
(Operation Any)
(///.with-buffer
(do ////.monad
- [_ (///.save! ["" ..prefix] ..runtime)]
+ [_ (///.save! true ["" ..prefix]
+ ..runtime)]
(///.save-buffer! ""))))
diff --git a/stdlib/source/lux/world/file.lux b/stdlib/source/lux/world/file.lux
index ec3cee16f..6fa386f05 100644
--- a/stdlib/source/lux/world/file.lux
+++ b/stdlib/source/lux/world/file.lux
@@ -1,5 +1,7 @@
(.module:
[lux #*
+ [host (#+ import:)]
+ ["@" target]
[abstract
["." monad (#+ Monad do)]]
[control
@@ -23,11 +25,7 @@
[macro
["." template]]
[world
- ["." binary (#+ Binary)]]
- [host (#+ import:)]
- [tool
- [compiler
- ["." host]]]])
+ ["." binary (#+ Binary)]]])
(type: #export Path Text)
@@ -184,189 +182,192 @@
(ex.report ["Instant" (%instant instant)]
["Path" file]))
-(template: (!delete path exception)
- (do io.monad
- [outcome (java/io/File::delete (java/io/File::new path))]
- (case outcome
- (#error.Success #1)
- (wrap (#error.Success []))
-
- _
- (io.io (ex.throw exception [path])))))
-
-(`` (for {(~~ (static host.old))
- (as-is (import: #long java/io/File
- (new [String])
- (~~ (template [<name>]
- [(<name> [] #io #try boolean)]
-
- [createNewFile] [mkdir]
- [exists] [delete]
- [isFile] [isDirectory]
- [canRead] [canWrite] [canExecute]))
-
- (length [] #io #try long)
- (listFiles [] #io #try #? (Array java/io/File))
- (getAbsolutePath [] #io #try String)
- (renameTo [java/io/File] #io #try boolean)
- (lastModified [] #io #try long)
- (setLastModified [long] #io #try boolean)
- (#static separator String))
-
- (import: java/lang/AutoCloseable
- (close [] #io #try void))
-
- (import: java/io/OutputStream
- (write [(Array byte)] #io #try void)
- (flush [] #io #try void))
-
- (import: java/io/FileOutputStream
- (new [java/io/File boolean] #io #try))
-
- (import: java/io/InputStream
- (read [(Array byte)] #io #try int))
-
- (import: java/io/FileInputStream
- (new [java/io/File] #io #try))
-
- (structure: (file path)
- (-> Path (File IO))
-
- (~~ (template [<name> <flag>]
- [(def: <name>
- (..can-modify
- (function (<name> data)
- (do (error.with io.monad)
- [stream (FileOutputStream::new (java/io/File::new path) <flag>)
- _ (OutputStream::write data stream)
- _ (OutputStream::flush stream)]
- (AutoCloseable::close stream)))))]
-
- [over-write #0]
- [append #1]
- ))
-
- (def: content
- (..can-query
- (function (content _)
- (do (error.with io.monad)
- [#let [file (java/io/File::new path)]
- size (java/io/File::length file)
- #let [data (binary.create (.nat size))]
- stream (FileInputStream::new file)
- bytes-read (InputStream::read data stream)
- _ (AutoCloseable::close stream)]
- (if (i/= size bytes-read)
- (wrap data)
- (io.io (ex.throw cannot-read-all-data path)))))))
-
- (def: size
- (..can-query
- (function (size _)
- (|> path
- java/io/File::new
- java/io/File::length
- (:: (error.with io.monad) map .nat)))))
-
- (def: last-modified
- (..can-query
- (function (last-modified _)
- (|> path
- java/io/File::new
- (java/io/File::lastModified)
- (:: (error.with io.monad) map (|>> duration.from-millis instant.absolute))))))
-
- (def: can-execute?
- (..can-query
- (function (can-execute? _)
- (|> path
- java/io/File::new
- java/io/File::canExecute))))
-
- (def: move
- (..can-open
- (function (move destination)
- (do io.monad
- [outcome (java/io/File::renameTo (java/io/File::new destination)
- (java/io/File::new path))]
- (case outcome
- (#error.Success #1)
- (wrap (#error.Success (file destination)))
-
- _
- (io.io (ex.throw cannot-move [destination path])))))))
-
- (def: modify
- (..can-modify
- (function (modify time-stamp)
- (do io.monad
- [outcome (java/io/File::setLastModified (|> time-stamp instant.relative duration.to-millis)
- (java/io/File::new path))]
- (case outcome
- (#error.Success #1)
- (wrap (#error.Success []))
-
- _
- (io.io (ex.throw cannot-modify [time-stamp path])))))))
-
- (def: delete
- (..can-delete
- (function (delete _)
- (!delete path cannot-delete-file)))))
-
- (structure: (directory path)
- (-> Path (Directory IO))
-
- (~~ (template [<name> <method> <capability>]
- [(def: <name>
- (..can-query
- (function (<name> _)
- (do (error.with io.monad)
- [?children (java/io/File::listFiles (java/io/File::new path))]
- (case ?children
- (#.Some children)
- (|> children
- array.to-list
- (monad.filter @ (|>> <method>))
- (:: @ map (monad.map @ (|>> java/io/File::getAbsolutePath (:: @ map <capability>))))
- (:: @ join))
-
- #.None
- (io.io (ex.throw not-a-directory [path])))))))]
-
- [files java/io/File::isFile file]
- [directories java/io/File::isDirectory directory]
- ))
-
- (def: discard
- (..can-delete
- (function (discard _)
- (!delete path cannot-discard-directory)))))
-
- (structure: #export system (System IO)
- (~~ (template [<name> <method> <capability> <exception>]
- [(def: <name>
- (..can-open
- (function (<name> path)
- (do io.monad
- [#let [file (java/io/File::new path)]
- outcome (<method> file)]
- (case outcome
- (#error.Success #1)
- (wrap (#error.Success (<capability> path)))
-
- _
- (wrap (ex.throw <exception> [path])))))))]
-
- [file java/io/File::isFile ..file cannot-find-file]
- [create-file java/io/File::createNewFile ..file cannot-create-file]
- [directory java/io/File::isDirectory ..directory cannot-find-directory]
- [create-directory java/io/File::mkdir ..directory cannot-create-directory]
- ))
-
- (def: separator (java/io/File::separator))
- ))
- }))
+(with-expansions [<for-jvm> (as-is (import: #long java/io/File
+ (new [String])
+ (~~ (template [<name>]
+ [(<name> [] #io #try boolean)]
+
+ [createNewFile] [mkdir]
+ [exists] [delete]
+ [isFile] [isDirectory]
+ [canRead] [canWrite] [canExecute]))
+
+ (length [] #io #try long)
+ (listFiles [] #io #try #? (Array java/io/File))
+ (getAbsolutePath [] #io #try String)
+ (renameTo [java/io/File] #io #try boolean)
+ (lastModified [] #io #try long)
+ (setLastModified [long] #io #try boolean)
+ (#static separator String))
+
+ (template: (!delete path exception)
+ (do io.monad
+ [outcome (java/io/File::delete (java/io/File::new path))]
+ (case outcome
+ (#error.Success #1)
+ (wrap (#error.Success []))
+
+ _
+ (io.io (ex.throw exception [path])))))
+
+ (import: java/lang/AutoCloseable
+ (close [] #io #try void))
+
+ (import: java/io/OutputStream
+ (write [(Array byte)] #io #try void)
+ (flush [] #io #try void))
+
+ (import: java/io/FileOutputStream
+ (new [java/io/File boolean] #io #try))
+
+ (import: java/io/InputStream
+ (read [(Array byte)] #io #try int))
+
+ (import: java/io/FileInputStream
+ (new [java/io/File] #io #try))
+
+ (structure: (file path)
+ (-> Path (File IO))
+
+ (~~ (template [<name> <flag>]
+ [(def: <name>
+ (..can-modify
+ (function (<name> data)
+ (do (error.with io.monad)
+ [stream (FileOutputStream::new (java/io/File::new path) <flag>)
+ _ (OutputStream::write data stream)
+ _ (OutputStream::flush stream)]
+ (AutoCloseable::close stream)))))]
+
+ [over-write #0]
+ [append #1]
+ ))
+
+ (def: content
+ (..can-query
+ (function (content _)
+ (do (error.with io.monad)
+ [#let [file (java/io/File::new path)]
+ size (java/io/File::length file)
+ #let [data (binary.create (.nat size))]
+ stream (FileInputStream::new file)
+ bytes-read (InputStream::read data stream)
+ _ (AutoCloseable::close stream)]
+ (if (i/= size bytes-read)
+ (wrap data)
+ (io.io (ex.throw cannot-read-all-data path)))))))
+
+ (def: size
+ (..can-query
+ (function (size _)
+ (|> path
+ java/io/File::new
+ java/io/File::length
+ (:: (error.with io.monad) map .nat)))))
+
+ (def: last-modified
+ (..can-query
+ (function (last-modified _)
+ (|> path
+ java/io/File::new
+ (java/io/File::lastModified)
+ (:: (error.with io.monad) map (|>> duration.from-millis instant.absolute))))))
+
+ (def: can-execute?
+ (..can-query
+ (function (can-execute? _)
+ (|> path
+ java/io/File::new
+ java/io/File::canExecute))))
+
+ (def: move
+ (..can-open
+ (function (move destination)
+ (do io.monad
+ [outcome (java/io/File::renameTo (java/io/File::new destination)
+ (java/io/File::new path))]
+ (case outcome
+ (#error.Success #1)
+ (wrap (#error.Success (file destination)))
+
+ _
+ (io.io (ex.throw cannot-move [destination path])))))))
+
+ (def: modify
+ (..can-modify
+ (function (modify time-stamp)
+ (do io.monad
+ [outcome (java/io/File::setLastModified (|> time-stamp instant.relative duration.to-millis)
+ (java/io/File::new path))]
+ (case outcome
+ (#error.Success #1)
+ (wrap (#error.Success []))
+
+ _
+ (io.io (ex.throw cannot-modify [time-stamp path])))))))
+
+ (def: delete
+ (..can-delete
+ (function (delete _)
+ (!delete path cannot-delete-file)))))
+
+ (structure: (directory path)
+ (-> Path (Directory IO))
+
+ (~~ (template [<name> <method> <capability>]
+ [(def: <name>
+ (..can-query
+ (function (<name> _)
+ (do (error.with io.monad)
+ [?children (java/io/File::listFiles (java/io/File::new path))]
+ (case ?children
+ (#.Some children)
+ (|> children
+ array.to-list
+ (monad.filter @ (|>> <method>))
+ (:: @ map (monad.map @ (|>> java/io/File::getAbsolutePath (:: @ map <capability>))))
+ (:: @ join))
+
+ #.None
+ (io.io (ex.throw not-a-directory [path])))))))]
+
+ [files java/io/File::isFile file]
+ [directories java/io/File::isDirectory directory]
+ ))
+
+ (def: discard
+ (..can-delete
+ (function (discard _)
+ (!delete path cannot-discard-directory)))))
+
+ (structure: #export system (System IO)
+ (~~ (template [<name> <method> <capability> <exception>]
+ [(def: <name>
+ (..can-open
+ (function (<name> path)
+ (do io.monad
+ [#let [file (java/io/File::new path)]
+ outcome (<method> file)]
+ (case outcome
+ (#error.Success #1)
+ (wrap (#error.Success (<capability> path)))
+
+ _
+ (wrap (ex.throw <exception> [path])))))))]
+
+ [file java/io/File::isFile ..file cannot-find-file]
+ [create-file java/io/File::createNewFile ..file cannot-create-file]
+ [directory java/io/File::isDirectory ..directory cannot-find-directory]
+ [create-directory java/io/File::mkdir ..directory cannot-create-directory]
+ ))
+
+ (def: separator (java/io/File::separator))
+ ))]
+ (`` (for {(~~ (static @.old))
+ (as-is <for-jvm>)
+
+ (~~ (static @.jvm))
+ (as-is <for-jvm>)})))
(template [<get> <signature> <create> <find> <exception>]
[(def: #export (<get> monad system path)
diff --git a/stdlib/source/lux/world/net/tcp.old.lux b/stdlib/source/lux/world/net/tcp.old.lux
index 1b7a8af18..85d306799 100644
--- a/stdlib/source/lux/world/net/tcp.old.lux
+++ b/stdlib/source/lux/world/net/tcp.old.lux
@@ -1,5 +1,7 @@
(.module:
[lux #*
+ [host (#+ import:)]
+ ["@" target]
[abstract
monad]
[control
@@ -12,38 +14,9 @@
[data
["." error (#+ Error)]]
[world
- ["." binary (#+ Binary)]]
- [host (#+ import:)]
- [tool
- [compiler
- ["." host]]]]
+ ["." binary (#+ Binary)]]]
["." // (#+ Can-Read Can-Write Can-Close)])
-(import: java/lang/AutoCloseable
- (close [] #io #try void))
-
-(import: java/io/Flushable
- (flush [] #io #try void))
-
-(import: java/io/InputStream
- (read [(Array byte) int int] #io #try int))
-
-(import: java/io/OutputStream
- (write [(Array byte) int int] #io #try void))
-
-(import: java/net/Socket
- (new [String int] #io #try)
- (getInputStream [] #try InputStream)
- (getOutputStream [] #try OutputStream))
-
-(import: java/net/ServerSocket
- (new [int] #io #try)
- (accept [] #io #try Socket))
-
-############################################################
-############################################################
-############################################################
-
(signature: #export (TCP !)
(: (Can-Read ! [Nat Binary])
read)
@@ -63,69 +36,94 @@
[write //.can-write]
[close //.can-close])))))
-(`` (for {(~~ (static host.old))
- (as-is (def: (tcp socket)
- (-> Socket (Error (TCP IO)))
- (do error.monad
- [input (Socket::getInputStream socket)
- output (Socket::getOutputStream socket)]
- (wrap (: (TCP IO)
- (structure (def: read
- (//.can-read
- (function (read size)
- (do (error.with io.monad)
- [#let [data (binary.create size)]
- bytes-read (InputStream::read data +0 (.int size) input)]
- (wrap [(.nat bytes-read)
- data])))))
-
- (def: write
- (//.can-write
- (function (write data)
- (do (error.with io.monad)
- [_ (OutputStream::write data +0 (.int (binary.size data))
- output)]
- (Flushable::flush output)))))
-
- (def: close
- (//.can-close
- (function (close _)
- (do (error.with io.monad)
- [_ (AutoCloseable::close input)
- _ (AutoCloseable::close output)]
- (AutoCloseable::close socket))))))))))
-
- (def: #export (client address port)
- (-> //.Address //.Port (IO (Error (TCP IO))))
- (do (error.with io.monad)
- [socket (Socket::new address (.int port))]
- (io.io (tcp socket))))
-
- (def: #export (server port)
- (-> //.Port (IO (Error [(Resolver Any)
- (Channel (TCP IO))])))
- (do (error.with io.monad)
- [server (ServerSocket::new (.int port))
- #let [[close-signal close-resolver] (: [(Promise Any) (Resolver Any)]
- (promise.promise []))
- _ (promise.await (function (_ _)
- (AutoCloseable::close server))
- close-signal)
- [output sink] (: [(Channel (TCP IO)) (Sink (TCP IO))]
- (frp.channel []))
- _ (: (Promise Any)
- (promise.future
- (loop [_ []]
- (do io.monad
- [?client (do (error.with io.monad)
- [socket (ServerSocket::accept server)]
- (io.io (tcp socket)))]
- (case ?client
- (#error.Failure error)
- (wrap [])
-
- (#error.Success client)
- (do @
- [_ (:: sink feed client)]
- (recur [])))))))]]
- (wrap [close-resolver output]))))}))
+(with-expansions [<for-jvm> (as-is (import: java/lang/AutoCloseable
+ (close [] #io #try void))
+
+ (import: java/io/Flushable
+ (flush [] #io #try void))
+
+ (import: java/io/InputStream
+ (read [(Array byte) int int] #io #try int))
+
+ (import: java/io/OutputStream
+ (write [(Array byte) int int] #io #try void))
+
+ (import: java/net/Socket
+ (new [String int] #io #try)
+ (getInputStream [] #try InputStream)
+ (getOutputStream [] #try OutputStream))
+
+ (import: java/net/ServerSocket
+ (new [int] #io #try)
+ (accept [] #io #try Socket))
+
+ (def: (tcp socket)
+ (-> Socket (Error (TCP IO)))
+ (do error.monad
+ [input (Socket::getInputStream socket)
+ output (Socket::getOutputStream socket)]
+ (wrap (: (TCP IO)
+ (structure (def: read
+ (//.can-read
+ (function (read size)
+ (do (error.with io.monad)
+ [#let [data (binary.create size)]
+ bytes-read (InputStream::read data +0 (.int size) input)]
+ (wrap [(.nat bytes-read)
+ data])))))
+
+ (def: write
+ (//.can-write
+ (function (write data)
+ (do (error.with io.monad)
+ [_ (OutputStream::write data +0 (.int (binary.size data))
+ output)]
+ (Flushable::flush output)))))
+
+ (def: close
+ (//.can-close
+ (function (close _)
+ (do (error.with io.monad)
+ [_ (AutoCloseable::close input)
+ _ (AutoCloseable::close output)]
+ (AutoCloseable::close socket))))))))))
+
+ (def: #export (client address port)
+ (-> //.Address //.Port (IO (Error (TCP IO))))
+ (do (error.with io.monad)
+ [socket (Socket::new address (.int port))]
+ (io.io (tcp socket))))
+
+ (def: #export (server port)
+ (-> //.Port (IO (Error [(Resolver Any)
+ (Channel (TCP IO))])))
+ (do (error.with io.monad)
+ [server (ServerSocket::new (.int port))
+ #let [[close-signal close-resolver] (: [(Promise Any) (Resolver Any)]
+ (promise.promise []))
+ _ (promise.await (function (_ _)
+ (AutoCloseable::close server))
+ close-signal)
+ [output sink] (: [(Channel (TCP IO)) (Sink (TCP IO))]
+ (frp.channel []))
+ _ (: (Promise Any)
+ (promise.future
+ (loop [_ []]
+ (do io.monad
+ [?client (do (error.with io.monad)
+ [socket (ServerSocket::accept server)]
+ (io.io (tcp socket)))]
+ (case ?client
+ (#error.Failure error)
+ (wrap [])
+
+ (#error.Success client)
+ (do @
+ [_ (:: sink feed client)]
+ (recur [])))))))]]
+ (wrap [close-resolver output]))))]
+ (`` (for {(~~ (static @.old))
+ (as-is <for-jvm>)
+
+ (~~ (static @.jvm))
+ (as-is <for-jvm>)})))
diff --git a/stdlib/source/lux/world/net/udp.old.lux b/stdlib/source/lux/world/net/udp.old.lux
index 9c58404fb..1f78f4b0d 100644
--- a/stdlib/source/lux/world/net/udp.old.lux
+++ b/stdlib/source/lux/world/net/udp.old.lux
@@ -1,5 +1,7 @@
(.module:
[lux #*
+ [host (#+ import:)]
+ ["@" target]
[abstract
monad]
[control
@@ -15,40 +17,9 @@
[collection
["." array]]]
[world
- ["." binary (#+ Binary)]]
- [host (#+ import:)]
- [tool
- [compiler
- ["." host]]]]
+ ["." binary (#+ Binary)]]]
["." // (#+ Location Can-Read Can-Write Can-Close)])
-(import: java/lang/AutoCloseable
- (close [] #io #try void))
-
-(import: java/io/Flushable
- (flush [] #io #try void))
-
-(import: java/net/InetAddress
- (#static getAllByName [String] #io #try (Array InetAddress))
- (getHostAddress [] String))
-
-(import: java/net/DatagramPacket
- (new #as new|send [(Array byte) int int InetAddress int])
- (new #as new|receive [(Array byte) int int])
- (getAddress [] InetAddress)
- (getPort [] int)
- (getLength [] int))
-
-(import: java/net/DatagramSocket
- (new #as new|client [] #io #try)
- (new #as new|server [int] #io #try)
- (receive [DatagramPacket] #io #try void)
- (send [DatagramPacket] #io #try void))
-
-############################################################
-############################################################
-############################################################
-
(exception: #export (cannot-resolve-address {address //.Address})
(ex.report ["Address" address]))
@@ -74,53 +45,80 @@
[write //.can-write]
[close //.can-close])))))
-(`` (for {(~~ (static host.old))
- (as-is (def: (resolve address)
- (-> //.Address (IO (Error InetAddress)))
- (do (error.with io.monad)
- [addresses (InetAddress::getAllByName address)]
- (: (IO (Error InetAddress))
- (case (array.size addresses)
- 0 (io.io (ex.throw cannot-resolve-address address))
- 1 (wrap (maybe.assume (array.read 0 addresses)))
- _ (io.io (ex.throw multiple-candidate-addresses address))))))
-
- (def: (udp socket)
- (-> DatagramSocket (UDP IO))
- (structure (def: read
- (//.can-read
- (function (read size)
- (let [data (binary.create size)
- packet (DatagramPacket::new|receive data +0 (.int size))]
+(with-expansions [<for-jvm> (as-is (import: java/lang/AutoCloseable
+ (close [] #io #try void))
+
+ (import: java/io/Flushable
+ (flush [] #io #try void))
+
+ (import: java/net/InetAddress
+ (#static getAllByName [String] #io #try (Array InetAddress))
+ (getHostAddress [] String))
+
+ (import: java/net/DatagramPacket
+ (new #as new|send [(Array byte) int int InetAddress int])
+ (new #as new|receive [(Array byte) int int])
+ (getAddress [] InetAddress)
+ (getPort [] int)
+ (getLength [] int))
+
+ (import: java/net/DatagramSocket
+ (new #as new|client [] #io #try)
+ (new #as new|server [int] #io #try)
+ (receive [DatagramPacket] #io #try void)
+ (send [DatagramPacket] #io #try void))
+
+ (def: (resolve address)
+ (-> //.Address (IO (Error InetAddress)))
(do (error.with io.monad)
- [_ (DatagramSocket::receive packet socket)
- #let [bytes-read (.nat (DatagramPacket::getLength packet))]]
- (wrap [bytes-read
- {#//.address (|> packet DatagramPacket::getAddress InetAddress::getHostAddress)
- #//.port (.nat (DatagramPacket::getPort packet))}
- data]))))))
-
- (def: write
- (//.can-write
- (function (write [location data])
- (do (error.with io.monad)
- [address (resolve (get@ #//.address location))]
- (DatagramSocket::send (DatagramPacket::new|send data +0 (.int (binary.size data)) address (.int (get@ #//.port location)))
- socket)))))
-
- (def: close
- (//.can-close
- (function (close _)
- (AutoCloseable::close socket))))))
-
- (def: #export client
- (IO (Error (UDP IO)))
- (|> (DatagramSocket::new|client)
- (:: (error.with io.monad) map ..udp)))
-
- (def: #export server
- (-> //.Port (IO (Error (UDP IO))))
- (|>> .int
- DatagramSocket::new|server
- (:: (error.with io.monad) map ..udp)))
- )}))
+ [addresses (InetAddress::getAllByName address)]
+ (: (IO (Error InetAddress))
+ (case (array.size addresses)
+ 0 (io.io (ex.throw cannot-resolve-address address))
+ 1 (wrap (maybe.assume (array.read 0 addresses)))
+ _ (io.io (ex.throw multiple-candidate-addresses address))))))
+
+ (def: (udp socket)
+ (-> DatagramSocket (UDP IO))
+ (structure (def: read
+ (//.can-read
+ (function (read size)
+ (let [data (binary.create size)
+ packet (DatagramPacket::new|receive data +0 (.int size))]
+ (do (error.with io.monad)
+ [_ (DatagramSocket::receive packet socket)
+ #let [bytes-read (.nat (DatagramPacket::getLength packet))]]
+ (wrap [bytes-read
+ {#//.address (|> packet DatagramPacket::getAddress InetAddress::getHostAddress)
+ #//.port (.nat (DatagramPacket::getPort packet))}
+ data]))))))
+
+ (def: write
+ (//.can-write
+ (function (write [location data])
+ (do (error.with io.monad)
+ [address (resolve (get@ #//.address location))]
+ (DatagramSocket::send (DatagramPacket::new|send data +0 (.int (binary.size data)) address (.int (get@ #//.port location)))
+ socket)))))
+
+ (def: close
+ (//.can-close
+ (function (close _)
+ (AutoCloseable::close socket))))))
+
+ (def: #export client
+ (IO (Error (UDP IO)))
+ (|> (DatagramSocket::new|client)
+ (:: (error.with io.monad) map ..udp)))
+
+ (def: #export server
+ (-> //.Port (IO (Error (UDP IO))))
+ (|>> .int
+ DatagramSocket::new|server
+ (:: (error.with io.monad) map ..udp)))
+ )]
+ (`` (for {(~~ (static @.old))
+ (as-is <for-jvm>)
+
+ (~~ (static @.jvm))
+ (as-is <for-jvm>)})))