aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/lang/translation/structure.jvm.lux
diff options
context:
space:
mode:
Diffstat (limited to 'new-luxc/source/luxc/lang/translation/structure.jvm.lux')
-rw-r--r--new-luxc/source/luxc/lang/translation/structure.jvm.lux59
1 files changed, 59 insertions, 0 deletions
diff --git a/new-luxc/source/luxc/lang/translation/structure.jvm.lux b/new-luxc/source/luxc/lang/translation/structure.jvm.lux
new file mode 100644
index 000000000..c3e07fd55
--- /dev/null
+++ b/new-luxc/source/luxc/lang/translation/structure.jvm.lux
@@ -0,0 +1,59 @@
+(;module:
+ lux
+ (lux (control [monad #+ do])
+ (data text/format
+ (coll [list]))
+ [meta]
+ [host #+ do-to])
+ (luxc ["&" base]
+ [";L" host]
+ (host ["$" jvm]
+ (jvm ["$t" type]
+ ["$d" def]
+ ["$i" inst]))
+ (lang ["la" analysis]
+ ["ls" synthesis]
+ (translation [";T" common])))
+ [../runtime])
+
+(def: $Object $;Type ($t;class "java.lang.Object" (list)))
+
+(def: #export (generate-tuple generate members)
+ (-> (-> ls;Synthesis (Meta $;Inst)) (List ls;Synthesis) (Meta $;Inst))
+ (do meta;Monad<Meta>
+ [#let [size (list;size members)]
+ _ (&;assert "Cannot generate tuples with less than 2 elements."
+ (n.>= +2 size))
+ membersI (|> members
+ list;enumerate
+ (monad;map @ (function [[idx member]]
+ (do @
+ [memberI (generate member)]
+ (wrap (|>. $i;DUP
+ ($i;int (nat-to-int idx))
+ memberI
+ $i;AASTORE)))))
+ (:: @ map $i;fuse))]
+ (wrap (|>. ($i;int (nat-to-int size))
+ ($i;array $Object)
+ membersI))))
+
+(def: (flagI tail?)
+ (-> Bool $;Inst)
+ (if tail?
+ ($i;string "")
+ $i;NULL))
+
+(def: #export (generate-variant generate tag tail? member)
+ (-> (-> ls;Synthesis (Meta $;Inst)) Nat Bool ls;Synthesis (Meta $;Inst))
+ (do meta;Monad<Meta>
+ [memberI (generate member)]
+ (wrap (|>. ($i;int (nat-to-int tag))
+ (flagI tail?)
+ memberI
+ ($i;INVOKESTATIC hostL;runtime-class
+ "variant_make"
+ ($t;method (list $t;int $Object $Object)
+ (#;Some ($t;array +1 $Object))
+ (list))
+ false)))))