(.module: [lux #* [control [monad (#+ do)]] [data [text ("text/" Hash) format]] [language ["." name] ["." reference (#+ Register Variable)] ["." compiler ("operation/" Monad) ["." translation]]]] [luxc [lang [host [jvm (#+ Inst Operation) ["$t" type] ["$i" inst]]]]] ["." //]) (do-template [ ] [(def: #export ( idx) (-> Nat Text) (|> idx .int %i (format )))] [foreign-name "f"] [partial-name "p"] ) (def: (foreign variable) (-> Register (Operation Inst)) (do compiler.Monad [function-class translation.context] (wrap (|>> ($i.ALOAD +0) ($i.GETFIELD function-class (|> variable .nat foreign-name) //.$Object))))) (def: local (-> Register (Operation Inst)) (|>> $i.ALOAD operation/wrap)) (def: #export (variable variable) (-> Variable (Operation Inst)) (case variable (#reference.Local variable) (local variable) (#reference.Foreign variable) (foreign variable))) (def: #export (constant [def-module def-name]) (-> Ident (Operation Inst)) (let [bytecode-name (format def-module "/" (name.normalize def-name) (%n (text/hash def-name)))] (operation/wrap ($i.GETSTATIC bytecode-name //.value-field //.$Object))))