(.module: lux (lux (control [monad #+ do]) (data [text] text/format (coll [list "list/" Functor] (dictionary ["dict" unordered #+ Dict]))) [macro "macro/" Monad]) (luxc ["&" lang] (lang ["la" analysis] ["ls" synthesis] (host [ruby #+ Ruby Expression Statement]))) [///] (/// [".T" runtime]) (// ["@" common])) ## (template [ ] ## [(def: ( _) @.Nullary )] ## [lua//nil "nil"] ## [lua//table "{}"] ## ) ## (def: (lua//global proc translate inputs) ## (-> Text @.Proc) ## (case inputs ## (^ (list [_ (#.Text name)])) ## (do macro.Monad ## [] ## (wrap name)) ## _ ## (&.throw @.Wrong-Syntax (@.wrong-syntax proc inputs)))) ## (def: (lua//call proc translate inputs) ## (-> Text @.Proc) ## (case inputs ## (^ (list& functionS argsS+)) ## (do {@ macro.Monad} ## [functionO (translate functionS) ## argsO+ (monad.map @ translate argsS+)] ## (wrap (lua.apply functionO argsO+))) ## _ ## (&.throw @.Wrong-Syntax (@.wrong-syntax proc inputs)))) ## (def: lua-procs ## @.Bundle ## (|> (dict.new text.Hash) ## (@.install "nil" (@.nullary lua//nil)) ## (@.install "table" (@.nullary lua//table)) ## (@.install "global" lua//global) ## (@.install "call" lua//call))) ## (def: (table//call proc translate inputs) ## (-> Text @.Proc) ## (case inputs ## (^ (list& tableS [_ (#.Text field)] argsS+)) ## (do {@ macro.Monad} ## [tableO (translate tableS) ## argsO+ (monad.map @ translate argsS+)] ## (wrap (lua.method field tableO argsO+))) ## _ ## (&.throw @.Wrong-Syntax (@.wrong-syntax proc inputs)))) ## (def: (table//get [fieldO tableO]) ## @.Binary ## (runtimeT.lua//get tableO fieldO)) ## (def: (table//set [fieldO valueO tableO]) ## @.Trinary ## (runtimeT.lua//set tableO fieldO valueO)) ## (def: table-procs ## @.Bundle ## (<| (@.prefix "table") ## (|> (dict.new text.Hash) ## (@.install "call" table//call) ## (@.install "get" (@.binary table//get)) ## (@.install "set" (@.trinary table//set))))) (def: #export procedures @.Bundle (<| (@.prefix "lua") (dict.new text.Hash) ## (|> lua-procs ## (dict.merge table-procs)) ))