aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/python.lux
blob: a1235130d707683d5f004233a4cf023031499a8b (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
73
74
75
76
77
78
79
80
81
82
83
84
(.module:
  [library
   [lux "*"
    [abstract
     [monad {"+" [do]}]]
    [control
     ["[0]" exception {"+" [exception:]}]]
    [target
     ["_" python]]]]
  ["[0]" / "_"
   [runtime {"+" [Phase]}]
   ["[1][0]" primitive]
   ["[1][0]" structure]
   ["[1][0]" reference]
   ["[1][0]" function]
   ["[1][0]" case]
   ["[1][0]" loop]
   ["/[1]" // "_"
    ["[1][0]" reference]
    ["/[1]" // "_"
     ["[1][0]" extension
      [generation
       [python
        ["[1]/[0]" common]]]]
     ["/[1]" // "_"
      [analysis {"+" []}]
      ["[1][0]" synthesis]
      ["//[1]" /// "_"
       ["[1][0]" phase ("[1]#[0]" monad)]
       [reference {"+" []}
        [variable {"+" []}]]]]]]])

(exception: .public cannot_recur_as_an_expression)

(def: .public (expression archive synthesis)
  Phase
  (case synthesis
    (^template [<tag> <generator>]
      [(^ (<tag> value))
       (//////phase#in (<generator> value))])
    ([////synthesis.bit  /primitive.bit]
     [////synthesis.i64  /primitive.i64]
     [////synthesis.f64  /primitive.f64]
     [////synthesis.text /primitive.text])

    (^ (////synthesis.variant variantS))
    (/structure.variant expression archive variantS)

    (^ (////synthesis.tuple members))
    (/structure.tuple expression archive members)

    {////synthesis.#Reference value}
    (//reference.reference /reference.system archive value)

    (^ (////synthesis.branch/case case))
    (/case.case ///extension/common.statement expression archive case)

    (^ (////synthesis.branch/let let))
    (/case.let expression archive let)

    (^ (////synthesis.branch/if if))
    (/case.if expression archive if)

    (^ (////synthesis.branch/get get))
    (/case.get expression archive get)

    (^ (////synthesis.loop/scope scope))
    (/loop.scope ///extension/common.statement expression archive scope)

    (^ (////synthesis.loop/recur updates))
    (//////phase.except ..cannot_recur_as_an_expression [])

    (^ (////synthesis.function/abstraction abstraction))
    (/function.function ///extension/common.statement expression archive abstraction)

    (^ (////synthesis.function/apply application))
    (/function.apply expression archive application)

    {////synthesis.#Extension extension}
    (///extension.apply archive expression extension)))

(def: .public generate
  Phase
  ..expression)