aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/host
diff options
context:
space:
mode:
authorEduardo Julian2017-11-01 13:36:15 -0400
committerEduardo Julian2017-11-01 13:36:15 -0400
commit88006e957373bbd72ec68897474303964885fc68 (patch)
treea34f88ea0921f56737c8881345245e11e7c8b546 /new-luxc/source/luxc/host
parent012f6bd41e527479dddbccbdab10daa78fd9a0fd (diff)
- Minor refactorings.
- Fixed some bugs. - Enabled macro-expansion for statements.
Diffstat (limited to '')
-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))))))
+ })