(.module: lux (lux (control [monad #+ do]) (data ["e" error]) [macro] [host]) (luxc (lang [".L" host] (translation (jvm [".T" common]))))) (for {"JVM" (as-is (host.import: java/lang/reflect/Method (invoke [Object (Array Object)] #try Object)) (host.import: (java/lang/Class c) (getMethod [String (Array (Class Object))] #try Method)) (host.import: java/lang/Object) (def: _object-class (Class Object) (host.class-for Object)) (def: _apply-args (Array (Class Object)) (|> (host.array (Class Object) +2) (host.array-write +0 _object-class) (host.array-write +1 _object-class))) (def: #export (expand macro inputs) (-> Macro (List Code) (Meta (List Code))) (do macro.Monad [class (commonT.load-class hostL.function-class)] (function (_ compiler) (do e.Monad [apply-method (Class::getMethod ["apply" _apply-args] class) output (Method::invoke [(:coerce Object macro) (|> (host.array Object +2) (host.array-write +0 (:coerce Object inputs)) (host.array-write +1 (:coerce Object compiler)))] apply-method)] (:coerce (e.Error [Lux (List Code)]) output)))))) })