(.module: lux (lux (control [monad #+ do]) (data [text "text/" Hash] text/format) [macro "macro/" Monad]) (luxc ["&" lang] (lang [".L" host] (host ["$" jvm] (jvm ["$t" type] ["$i" inst])) ["ls" synthesis] [".L" variable #+ Variable])) (// [".T" common])) (do-template [ ] [(def: #export ( idx) (-> Nat Text) (|> idx nat-to-int %i (format )))] [captured "c"] [partial "p"] ) (def: #export (translate-captured variable) (-> Variable (Meta $.Inst)) (do macro.Monad [this-module macro.current-module-name function-class hostL.context #let [function-class (format (text.replace-all "/" "." this-module) "." function-class)]] (wrap (|>> ($i.ALOAD +0) ($i.GETFIELD function-class (|> variable i/inc (i/* -1) int-to-nat captured) commonT.$Object))))) (def: #export (translate-local variable) (-> Variable (Meta $.Inst)) (macro/wrap ($i.ALOAD (int-to-nat variable)))) (def: #export (translate-variable variable) (-> Variable (Meta $.Inst)) (if (variableL.captured? variable) (translate-captured variable) (translate-local variable))) (def: #export (translate-definition [def-module def-name]) (-> Ident (Meta $.Inst)) (let [bytecode-name (format def-module "/" (&.normalize-name def-name) (%n (text/hash def-name)))] (macro/wrap ($i.GETSTATIC bytecode-name commonT.value-field commonT.$Object))))