(;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))))))
})