aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/host/macro.lux
diff options
context:
space:
mode:
Diffstat (limited to 'new-luxc/source/luxc/host/macro.lux')
-rw-r--r--new-luxc/source/luxc/host/macro.lux37
1 files changed, 37 insertions, 0 deletions
diff --git a/new-luxc/source/luxc/host/macro.lux b/new-luxc/source/luxc/host/macro.lux
new file mode 100644
index 000000000..1a3152222
--- /dev/null
+++ b/new-luxc/source/luxc/host/macro.lux
@@ -0,0 +1,37 @@
+(;module:
+ lux
+ (lux (control [monad #+ do])
+ (data ["e" error])
+ [meta]
+ [host])
+ (luxc [";L" host]
+ (lang (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 meta;Monad<Meta>
+ [class (commonT;load-class hostL;function-class)]
+ (function [compiler]
+ (do e;Monad<Error>
+ [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))))))
+ })