(.module: [lux #* [abstract [monad (#+ do)]] [data [text ["%" format (#+ format)]]] [target [jvm ["." type]]] [tool [compiler ["." reference (#+ Register Variable)] ["." phase ("operation@." monad)] [meta [archive (#+ Archive)]] [language [lux ["." generation]]]]]] [luxc [lang [host [jvm (#+ Inst Operation) ["_" inst]]]]] ["." // ["#." runtime]]) (template [ ] [(def: #export (-> Nat Text) (|>> %.nat (format )))] [foreign-name "f"] [partial-name "p"] ) (def: (foreign variable) (-> Register (Operation Inst)) (do phase.monad [class-name (:: @ map //runtime.class-name generation.context)] (wrap (|>> (_.ALOAD 0) (_.GETFIELD (type.class class-name (list)) (|> variable .nat foreign-name) //.$Value))))) (def: local (-> Register Inst) (|>> _.ALOAD)) (def: #export (variable variable) (-> Variable (Operation Inst)) (case variable (#reference.Local variable) (operation@wrap (local variable)) (#reference.Foreign variable) (foreign variable))) (def: #export (constant archive name) (-> Archive Name (Operation Inst)) (do phase.monad [class-name (:: @ map //runtime.class-name (generation.remember archive name))] (wrap (_.GETSTATIC (type.class class-name (list)) //.value-field //.$Value))))