(.using [library [lux {"-" Definition} [program {"+" program:}] ["@" target] ["[0]" ffi {"+" import:}] [abstract [monad {"+" do}]] [control ["[0]" io {"+" IO}] ["[0]" try {"+" Try}] [concurrency ["[0]" async {"+" Async}]]] [data ["[0]" product] [text ["%" format {"+" format}]] [collection [array {"+" Array}]]] ["[0]" world "_" ["[0]" file] ["[1]/[0]" program]] [target ["[0]" jvm "_" [bytecode {"+" Bytecode}] ["[1]/[0]" type ["[1]/[0]" box]]]] [tool [compiler {"+"} ["[0]" phase] [default ["[0]" platform {"+" Platform}]] [meta [archive {"+" Archive}] ["[0]" context] ["[0]" cli] ["[0]" packager "_" ["[1]" jvm]]] [language [lux [generation {"+" Operation}] [analysis [macro {"+" Expander}]] [phase ["[0]" extension ["[0]" analysis "_" ["[1]" jvm]] ["[0]" generation "_" ["[1]" jvm]] ["[0]" directive "_" ["[1]" jvm]]] [generation ["/" jvm ["[1][0]" runtime {"+" Anchor Definition}] ["[1][0]" host] ["[1][0]" program]]]]]]]]]] [program ["[0]" compositor]]) (import: java/lang/reflect/Method "[1]::[0]" (invoke [java/lang/Object [java/lang/Object]] "try" java/lang/Object)) (import: java/lang/ClassLoader "[1]::[0]") (import: (java/lang/Class c) "[1]::[0]" (getMethod [java/lang/String [(java/lang/Class java/lang/Object)]] "try" java/lang/reflect/Method)) (import: java/lang/Object "[1]::[0]" (getClass [] (java/lang/Class java/lang/Object))) (def: _object_class (java/lang/Class java/lang/Object) (ffi.class_for java/lang/Object)) (def: _apply2_args (Array (java/lang/Class java/lang/Object)) (|> (ffi.array (java/lang/Class java/lang/Object) 2) (ffi.write! 0 _object_class) (ffi.write! 1 _object_class))) (def: _apply5_args (Array (java/lang/Class java/lang/Object)) (|> (ffi.array (java/lang/Class java/lang/Object) 5) (ffi.write! 0 _object_class) (ffi.write! 1 _object_class) (ffi.write! 2 _object_class) (ffi.write! 3 _object_class) (ffi.write! 4 _object_class))) (def: .public (expander macro inputs lux) Expander (do try.monad [apply_method (|> macro (as java/lang/Object) (java/lang/Object::getClass) (java/lang/Class::getMethod "apply" _apply2_args))] (as (Try (Try [Lux (List Code)])) (java/lang/reflect/Method::invoke (as java/lang/Object macro) (|> (ffi.array java/lang/Object 2) (ffi.write! 0 (as java/lang/Object inputs)) (ffi.write! 1 (as java/lang/Object lux))) apply_method)))) (def: (phase_wrapper archive) (-> Archive (Operation Anchor (Bytecode Any) Definition phase.Wrapper)) (# phase.monad in (|>>))) (def: .public platform (IO [java/lang/ClassLoader /runtime.Host (Platform Anchor (Bytecode Any) Definition)]) (do io.monad [[loader host] /host.host] (in [loader host [platform.#file_system (file.async file.default) platform.#host host platform.#phase /.generate platform.#runtime /runtime.generate platform.#phase_wrapper ..phase_wrapper platform.#write product.right]]))) (def: (extender phase_wrapper) (-> phase.Wrapper extension.Extender) ... TODO: Stop relying on coercions ASAP. (<| (as extension.Extender) (function (@self handler)) (as extension.Handler) (function (@self name phase)) (as extension.Phase) (function (@self archive parameters)) (as extension.Operation) (function (@self state)) (as Try) try.trusted (as Try) (do try.monad [method (|> handler (as java/lang/Object) (java/lang/Object::getClass) (java/lang/Class::getMethod "apply" _apply5_args))] (java/lang/reflect/Method::invoke (as java/lang/Object handler) (|> (ffi.array java/lang/Object 5) (ffi.write! 0 (as java/lang/Object name)) (ffi.write! 1 (as java/lang/Object (phase_wrapper phase))) (ffi.write! 2 (as java/lang/Object archive)) (ffi.write! 3 (as java/lang/Object parameters)) (ffi.write! 4 (as java/lang/Object state))) method)))) (def: (declare_success! _) (-> Any (Async Any)) (async.future (# world/program.default exit +0))) (def: (lux_compiler it) (-> Any platform.Custom) (as_expected it)) (program: [service cli.service] (let [context (context.jvm (cli.target service))] (exec (do async.monad [[loader host platform] (async.future ..platform) _ (compositor.compiler ..lux_compiler context ..expander (analysis.bundle loader host) (io.io platform) generation.bundle (|>> ..extender (directive.bundle loader)) (/program.program /runtime.class_name) [Anchor (type (Bytecode Any)) Definition] ..extender service [(packager.package context) (format (cli.target service) (# file.default separator) "program.jar")])] (..declare_success! [])) (io.io []))))