aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/tool/compiler/language/lux/phase/generation/js.lux
blob: 5d6b9282479ec2d4ef96532792c03dd6e525981b (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
85
86
87
88
89
(.using
 [library
  [lux (.except)
   [abstract
    [monad (.only do)]]
   [control
    ["[0]" exception (.only exception:)]]
   [macro
    ["^" pattern]]
   [target
    ["_" js]]]]
 ["[0]" /
  [runtime (.only Phase Phase!)]
  ["[1][0]" primitive]
  ["[1][0]" structure]
  ["[1][0]" reference]
  ["[1][0]" case]
  ["[1][0]" loop]
  ["[1][0]" function]
  ["/[1]" //
   ["[1][0]" reference]
   ["/[1]" //
    ["[1][0]" extension (.only)
     [generation
      [js
       ["[1]/[0]" common]]]]
    ["/[1]" //
     [analysis (.only)]
     ["[0]" synthesis]
     ["//[1]" ///
      ["[1][0]" phase (.open: "[1]#[0]" monad)]
      [reference (.only)
       [variable (.only)]]]]]]])

(exception: .public cannot_recur_as_an_expression)

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

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

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

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

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

    (pattern (synthesis.branch/exec it))
    (/case.exec expression archive it)

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

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

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

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

    (pattern (synthesis.loop/again updates))
    (//////phase.except ..cannot_recur_as_an_expression [])

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

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

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

(def .public generate
  Phase
  ..expression)