aboutsummaryrefslogtreecommitdiff
path: root/src/lux/analyser/case.clj
blob: cd5bf9e39b10ccb6f425c0cf1bf42a2873d649f3 (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
(ns lux.analyser.case
  (:require [clojure.core.match :as M :refer [match matchv]]
            clojure.core.match.array
            (lux [base :as & :refer [exec return fail]]
                 [parser :as &parser]
                 [type :as &type])
            (lux.analyser [base :as &&]
                          [env :as &env])))

;; [Resources]
(defn locals [member]
  (matchv ::M/objects [member]
    [["Ident" ?name]]
    (&/|list ?name)

    [["Tuple" ?submembers]]
    (&/flat-map locals ?submembers)

    [["Form" ["Cons" [["Tag" _] ?submembers]]]]
    (&/flat-map locals ?submembers)

    [_]
    (&/|list)))

(defn analyse-branch [analyse max-registers [bindings body]]
  ;; (prn 'analyse-branch max-registers bindings body)
  (reduce (fn [body* name]
            (&&/with-var
              (fn [=var]
                (&env/with-local name =var body*))))
          (reduce (fn [body* _]
                    (&env/with-local "" &type/+dont-care+ body*))
                  (&&/analyse-1 analyse body)
                  (range (- max-registers (count bindings))))
          (reverse bindings)))