(;module: lux (lux (control [monad #+ do]) (data ["e" error]) [macro] [host]) (luxc (lang [";L" host] (translation [";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 (getClass [] (Class Object)) (toString [] String)) (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 [(:! Object macro) (|> (host;array Object +2) (host;array-write +0 (:! Object inputs)) (host;array-write +1 (:! Object compiler)))] apply-method)] (:! (e;Error [Compiler (List Code)]) output)))))) })