(.module:
lux
(lux (control monad)
(data [text]
text/format)
[macro]
[host #+ do-to])
(luxc ["&" lang]
(lang (host ["$" jvm]
(jvm ["$t" type]
["$d" def]
["$i" inst]))
["la" analysis]
["ls" synthesis]))
(// [".T" common]))
(host.import java/lang/reflect/Field
(get [Object] Object))
(host.import (java/lang/Class a)
(getField [String] Field))
(def: #export (eval valueI)
(-> $.Inst (Meta Any))
(do macro.Monad
[current-module macro.current-module-name
class-name (:: @ map %code (macro.gensym (format current-module "/eval")))
#let [store-name (text.replace-all "/" "." class-name)
bytecode ($d.class #$.V1_6
#$.Public $.noneC
class-name
(list) ["java.lang.Object" (list)]
(list)
(|>> ($d.field #$.Public ($_ $.++F $.finalF $.staticF)
commonT.value-field commonT.$Object)
($d.method #$.Public ($_ $.++M $.staticM $.strictM)
""
($t.method (list) #.None (list))
(|>> valueI
($i.PUTSTATIC store-name commonT.value-field commonT.$Object)
$i.RETURN))))]
_ (commonT.store-class store-name bytecode)
class (commonT.load-class store-name)]
(wrap (|> class
(Class::getField [commonT.value-field])
(Field::get (host.null))))))