diff options
| author | Eduardo Julian | 2017-11-01 13:36:15 -0400 | 
|---|---|---|
| committer | Eduardo Julian | 2017-11-01 13:36:15 -0400 | 
| commit | 88006e957373bbd72ec68897474303964885fc68 (patch) | |
| tree | a34f88ea0921f56737c8881345245e11e7c8b546 /new-luxc/source/luxc/host | |
| parent | 012f6bd41e527479dddbccbdab10daa78fd9a0fd (diff) | |
- Minor refactorings.
- Fixed some bugs.
- Enabled macro-expansion for statements.
Diffstat (limited to '')
| -rw-r--r-- | new-luxc/source/luxc/host/macro.lux | 37 | 
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)))))) +      })  | 
