aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/analyser/type.lux
blob: 3b9b832453f556ab5259b7f294bd806329f8f609 (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
(;module:
  lux
  (lux (control monad)
       [macro #+ Monad<Lux>]
       (type ["TC" check]))
  (luxc ["&" base]
        (lang ["la" analysis #+ Analysis])))

## [Analysers]
(def: #export (analyse-check analyse eval type value)
  (-> &;Analyser &;Eval Code Code (Lux Analysis))
  (do Monad<Lux>
    [actual (eval Type type)
     #let [actual (:! Type actual)]
     expected macro;expected-type
     _ (&;within-type-env
        (TC;check expected actual))]
    (&;with-expected-type actual
      (analyse value))))

(def: #export (analyse-coerce analyse eval type value)
  (-> &;Analyser &;Eval Code Code (Lux Analysis))
  (do Monad<Lux>
    [actual (eval Type type)
     expected macro;expected-type
     _ (&;within-type-env
        (TC;check expected (:! Type actual)))]
    (&;with-expected-type Top
      (analyse value))))