(.module: [library [lux #* ## [abstract ## [monad (#+ do)]] ## [control ## ["." try (#+ Try)] ## ["ex" exception (#+ exception:)] ## ["." io]] ## [data ## [binary (#+ Binary)] ## ["." text ("#/." hash) ## format] ## [collection ## ["." dictionary (#+ Dictionary)]]] ## ["." macro] ## [host (#+ import:)] ## [tool ## [compiler ## [reference (#+ Register)] ## ["." name] ## ["." phase]]] ]] ## [luxc ## [lang ## [host ## ["." jvm ## [type]]]]] ) ## (def: .public (with-artifacts action) ## (All [a] (-> (Meta a) (Meta [Artifacts a]))) ## (function (_ state) ## (case (action (update@ #.host ## (|>> (:coerce Host) ## (set@ #artifacts (dictionary.new text.hash)) ## (:coerce Nothing)) ## state)) ## (#try.Success [state' output]) ## (#try.Success [(update@ #.host ## (|>> (:coerce Host) ## (set@ #artifacts (|> (get@ #.host state) (:coerce Host) (get@ #artifacts))) ## (:coerce Nothing)) ## state') ## [(|> state' (get@ #.host) (:coerce Host) (get@ #artifacts)) ## output]]) ## (#try.Failure error) ## (#try.Failure error)))) ## (def: .public (load-definition state) ## (-> Lux (-> Name Binary (Try Any))) ## (function (_ (^@ def-name [def-module def-name]) def-bytecode) ## (let [normal-name (format (name.normalize def-name) (%n (text/hash def-name))) ## class-name (format (text.replace-all "/" "." def-module) "." normal-name)] ## (<| (macro.run state) ## (do macro.monad ## [_ (..store-class class-name def-bytecode) ## class (..load-class class-name)] ## (case (do try.monad ## [field (Class::getField [..value-field] class)] ## (Field::get [#.None] field)) ## (#try.Success (#.Some def-value)) ## (wrap def-value) ## (#try.Success #.None) ## (phase.throw invalid-definition-value (%name def-name)) ## (#try.Failure error) ## (phase.throw cannot-load-definition ## (format "Definition: " (%name def-name) "\n" ## "Error:\n" ## error))))))))