(.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 [lua #+ Lua Expression Statement]))) [///] (/// [".T" runtime]) (// ["@" common])) (do-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") (|> lua-procs (dict.merge table-procs))))