(.module: [lux #* ["@" host (#+ import:)] [abstract [monad (#+ do)]] [control [cli (#+ program:)] ["." io (#+ IO)]] [data ["." error (#+ Error)] [collection [array (#+ Array)] ["." dictionary]]] [world ["." file]] [tool [compiler [phase ["." macro (#+ Expander)]] [default ["." platform (#+ Platform)]]]]] [program ["/" compositor ["/." cli]]] [luxc [lang [host ["_" jvm ["$t" type] ["$d" def] ["$i" inst]]] [translation ["." jvm ["." runtime] ["." expression] [procedure ["." common] ["." host]]]]]]) (import: #long java/lang/reflect/Method (invoke [java/lang/Object (Array java/lang/Object)] #try java/lang/Object)) (import: #long (java/lang/Class c) (getMethod [java/lang/String (Array (java/lang/Class java/lang/Object))] #try java/lang/reflect/Method)) (import: #long java/lang/Object (getClass [] (java/lang/Class java/lang/Object))) (def: _object-class (java/lang/Class java/lang/Object) (@.class-for java/lang/Object)) (def: _apply-args (Array (java/lang/Class java/lang/Object)) (|> (@.array (java/lang/Class java/lang/Object) 2) (@.array-write 0 _object-class) (@.array-write 1 _object-class))) (def: (expander macro inputs lux) Expander (do error.monad [apply-method (|> macro (:coerce java/lang/Object) (java/lang/Object::getClass) (java/lang/Class::getMethod "apply" _apply-args))] (:coerce (Error (Error [Lux (List Code)])) (java/lang/reflect/Method::invoke (:coerce java/lang/Object macro) (|> (@.array java/lang/Object 2) (@.array-write 0 (:coerce java/lang/Object inputs)) (@.array-write 1 (:coerce java/lang/Object lux))) apply-method)))) (def: jvm (IO (Platform IO _.Anchor _.Inst _.Definition)) (do io.monad [host jvm.host] (wrap {#platform.&monad io.monad #platform.&file-system file.system #platform.host host #platform.phase expression.translate #platform.runtime runtime.translate}))) (def: (program programI) (-> _.Inst _.Definition) (let [nilI runtime.noneI num-inputsI (|>> ($i.ALOAD 0) $i.ARRAYLENGTH) decI (|>> ($i.int +1) $i.ISUB) headI (|>> $i.DUP ($i.ALOAD 0) $i.SWAP $i.AALOAD $i.SWAP $i.DUP_X2 $i.POP) pairI (|>> ($i.int +2) ($i.ANEWARRAY "java.lang.Object") $i.DUP_X1 $i.SWAP ($i.int +0) $i.SWAP $i.AASTORE $i.DUP_X1 $i.SWAP ($i.int +1) $i.SWAP $i.AASTORE) consI (|>> ($i.int +1) ($i.string "") $i.DUP2_X1 $i.POP2 runtime.variantI) prepare-input-listI (<| $i.with-label (function (_ @loop)) $i.with-label (function (_ @end)) (|>> nilI num-inputsI ($i.label @loop) decI $i.DUP ($i.IFLT @end) headI pairI consI $i.SWAP ($i.GOTO @loop) ($i.label @end) $i.POP ($i.ASTORE 0))) run-ioI (|>> ($i.CHECKCAST jvm.function-class) $i.NULL ($i.INVOKEVIRTUAL jvm.function-class runtime.apply-method (runtime.apply-signature 1) #0)) main-type ($t.method (list ($t.array 1 ($t.class "java.lang.String" (list)))) #.None (list)) bytecode-name "_"] [bytecode-name ($d.class #_.V1_6 #_.Public _.finalC bytecode-name (list) ["java.lang.Object" (list)] (list) (|>> ($d.method #_.Public _.staticM "main" main-type (|>> prepare-input-listI programI run-ioI $i.POP $i.RETURN))))])) (program: [{service /cli.service}] (/.compiler ..expander ..jvm (dictionary.merge common.bundle host.bundle) ..program service))