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)))
|