aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/tool/compiler/language/lux/directive.lux
blob: 94b7a78940a961b86c0bb372ba11f589ee9d0542 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
(.using
 [library
  [lux {"-" Module}
   [abstract
    [monad {"+" do}]]
   [control
    ["[0]" try]]
   [data
    [collection
     ["[0]" list ("[1]#[0]" monoid)]]]]]
 [//
  ["[0]" analysis]
  ["[0]" synthesis]
  ["[0]" generation]
  [phase
   ["[0]" extension]]
  [///
   ["[0]" phase]
   [meta
    [archive
     [module
      [descriptor {"+" Module}]]]]]])

(type: .public (Component state phase)
  (Record
   [#state state
    #phase phase]))

(type: .public (State anchor expression directive)
  (Record
   [#analysis (Component analysis.State+
                         analysis.Phase)
    #synthesis (Component synthesis.State+
                          synthesis.Phase)
    #generation (Component (generation.State+ anchor expression directive)
                           (generation.Phase anchor expression directive))]))

(type: .public Import
  (Record
   [#module Module
    #alias Text]))

(type: .public Requirements
  (Record
   [#imports (List Import)
    #referrals (List Code)]))

(def: .public no_requirements
  Requirements
  [#imports (list)
   #referrals (list)])

(def: .public (merge_requirements left right)
  (-> Requirements Requirements Requirements)
  [#imports (list#composite (value@ #imports left) (value@ #imports right))
   #referrals (list#composite (value@ #referrals left) (value@ #referrals right))])

(template [<special> <general>]
  [(type: .public (<special> anchor expression directive)
     (<general> (..State anchor expression directive) Code Requirements))]

  [State+    extension.State]
  [Operation extension.Operation]
  [Phase     extension.Phase]
  [Handler   extension.Handler]
  [Bundle    extension.Bundle]
  )

(template [<name> <component> <phase>]
  [(def: .public <name>
     (All (_ anchor expression directive)
       (Operation anchor expression directive <phase>))
     (function (_ [bundle state])
       {try.#Success [[bundle state] (value@ [<component> ..#phase] state)]}))]

  [analysis   ..#analysis   analysis.Phase]
  [synthesis  ..#synthesis  synthesis.Phase]
  [generation ..#generation (generation.Phase anchor expression directive)]
  )

(template [<name> <component> <operation>]
  [(def: .public <name>
     (All (_ anchor expression directive output)
       (-> (<operation> output)
           (Operation anchor expression directive output)))
     (|>> (phase.sub [(value@ [<component> ..#state])
                      (with@ [<component> ..#state])])
          extension.lifted))]

  [lifted_analysis   ..#analysis   analysis.Operation]
  [lifted_synthesis  ..#synthesis  synthesis.Operation]
  [lifted_generation ..#generation (generation.Operation anchor expression directive)]
  )

(def: .public (set_current_module module)
  (All (_ anchor expression directive)
    (-> Module (Operation anchor expression directive Any)))
  (do phase.monad
    [_ (..lifted_analysis
        (analysis.set_current_module module))]
    (..lifted_generation
     (generation.enter_module module))))