aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/lang/translation/jvm/common.lux
blob: 6cd7f4f2f6604c11a736b1b05171a8c62a8b7287 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
(.module:
  [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: #export (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: #export (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))))))))