(.module: lux (lux (control [monad #+ do]) [macro] (data text/format)) (luxc (lang [".L" module] (host [ruby #+ Ruby Expression Statement]))) [//] (// [".T" runtime] [".T" reference] [".T" eval])) (def: #export (translate-def name expressionT expressionO metaV) (-> Text Type Expression Code (Meta Any)) (do macro.Monad [current-module macro.current-module-name #let [def-ident [current-module name]]] (case (macro.get-symbol-ann (ident-for #.alias) metaV) (#.Some real-def) (do @ [[realT realA realV] (macro.find-def real-def) _ (moduleL.define def-ident [realT metaV realV])] (wrap [])) _ (do @ [#let [def-name (referenceT.global def-ident)] _ (//.save (ruby.global! def-name expressionO)) expressionV (evalT.eval (ruby.global def-name)) _ (moduleL.define def-ident [expressionT metaV expressionV]) _ (if (macro.type? metaV) (case (macro.declared-tags metaV) #.Nil (wrap []) tags (moduleL.declare-tags tags (macro.export? metaV) (:coerce Type expressionV))) (wrap [])) #let [_ (log! (format "DEF " (%ident def-ident)))]] (wrap [])) ))) (def: #export (translate-program programO) (-> Expression (Meta Statement)) (macro.fail "translate-program NOT IMPLEMENTED YET") ## (hostT.save (format "var " (referenceT.variable +0) " = " runtimeT.lux//program-args "();" ## "(" programO ")(null);")) )