aboutsummaryrefslogtreecommitdiff
path: root/src/lux/analyser/lux.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/lux/analyser/lux.clj')
-rw-r--r--src/lux/analyser/lux.clj81
1 files changed, 40 insertions, 41 deletions
diff --git a/src/lux/analyser/lux.clj b/src/lux/analyser/lux.clj
index b7aa46cee..ba6f40ff3 100644
--- a/src/lux/analyser/lux.clj
+++ b/src/lux/analyser/lux.clj
@@ -2,7 +2,7 @@
(:require (clojure [template :refer [do-template]])
[clojure.core.match :refer [match]]
(lux [util :as &util :refer [exec return fail
- try-all-m map-m mapcat-m reduce-m
+ if-m try-all-m map-m mapcat-m reduce-m
assert!]]
[parser :as &parser]
[type :as &type]
@@ -19,11 +19,11 @@
=elems-types (map-m &/expr-type =elems)
;; :let [_ (prn 'analyse-tuple =elems)]
]
- (return (list [::&/Expression [::tuple =elems] [::&type/Tuple =elems-types]]))))
+ (return (list [::&/Expression [::&/tuple =elems] [::&type/Tuple =elems-types]]))))
(defn analyse-ident [analyse ident]
(fn [state]
- (let [[top & stack*] (::local-envs state)]
+ (let [[top & stack*] (::&util/local-envs state)]
(if-let [=bound (or (get-in top [:locals :mappings ident])
(get-in top [:closure :mappings ident]))]
[::&util/ok [state (list =bound)]]
@@ -52,7 +52,7 @@
(match =fn
[::&/Expression =fn-form =fn-type]
(match =fn-form
- [::global ?module ?name]
+ [::&/global ?module ?name]
(exec [macro? (&&env/macro? ?module ?name)]
(if macro?
(let [macro-class (&host/location (list ?name ?module))
@@ -66,11 +66,11 @@
(if (> needs-num provides-num)
[needs-num [::&type/function (drop provides-num ?fargs) ?freturn]]
[needs-num &type/+dont-care-type+])))]]
- (return (list [::&/Expression [::static-call needs-num =fn =args] =return-type])))))
+ (return (list [::&/Expression [::&/static-call needs-num =fn =args] =return-type])))))
_
(exec [=args (mapcat-m analyse ?args)]
- (return (list [::&/Expression [::call =fn =args] &type/+dont-care-type+]))))
+ (return (list [::&/Expression [::&/call =fn =args] &type/+dont-care-type+]))))
:else
(fail "Can't call something without a type."))
@@ -84,57 +84,56 @@
locals-per-branch (map &&case/locals (map first branches))
max-locals (reduce max 0 (map count locals-per-branch))]
base-register &&env/next-local-idx
- =bodies (map-m (partial &&case/analyse-branch &/analyse-1 max-locals)
+ =bodies (map-m (partial &&case/analyse-branch analyse max-locals)
(map vector locals-per-branch (map second branches)))
+ :let [_ (prn 'analyse-case/=bodies =bodies)]
=body-types (map-m &/expr-type =bodies)
=case-type (reduce-m &type/merge [::&type/Nothing] =body-types)
:let [=branches (map vector (map first branches) =bodies)]]
- (return (list [::&/Expression [::case =variant base-register max-locals =branches] =case-type]))))
+ (return (list [::&/Expression [::&/case =variant base-register max-locals =branches] =case-type]))))
(defn analyse-lambda [analyse ?self ?arg ?body]
- (exec [[_ =arg =return :as =function] &type/fresh-function
- [=scope =captured =body] (&&lambda/with-lambda ?self =function
+ (exec [[_ =arg =return :as =lambda-type] &type/fresh-function
+ [=scope =captured =body] (&&lambda/with-lambda ?self =lambda-type
?arg =arg
(&/analyse-1 analyse ?body))
=body-type (&/expr-type =body)
- =function (exec [_ (&type/solve =return =body-type)]
- (&type/clean =function))
- :let [=lambda (match =body
- [::&/Expression [::lambda ?sub-scope ?sub-captured ?sub-args ?sub-body] =body-type]
- [::&/Expression [::lambda =scope =captured (cons ?arg ?sub-args) (&&lambda/raise-expr ?arg ?sub-body)] =body-type]
+ =lambda-type (exec [_ (&type/solve =return =body-type)]
+ (&type/clean =lambda-type))
+ :let [=lambda-form (match =body
+ [::&/Expression [::&/lambda ?sub-scope ?sub-captured ?sub-args ?sub-body] _]
+ [::&/lambda =scope =captured (cons ?arg ?sub-args) (&&lambda/raise-expr ?arg ?sub-body)]
- _
- [::&/Expression [::lambda =scope =captured (list ?arg) =body] =body-type])]]
- (return (list [::&/Expression =lambda =function]))))
+ _
+ [::&/lambda =scope =captured (list ?arg) =body])]]
+ (return (list [::&/Expression =lambda-form =lambda-type]))))
(defn analyse-def [analyse ?name ?value]
;; (prn 'analyse-def ?name ?value)
- (exec [def?? (&&env/defined? ?name)]
- (if def??
- (fail (str "Can't redefine " ?name))
- (exec [ann?? (&&env/annotated? ?name)
- $module &util/get-module-name
- =value (&/analyse-1 analyse ?value)
- =value (match =value
- [::&/Expression =value-form =value-type]
- (return (match =value-form
- [::lambda ?old-scope ?env ?args ?body]
- [::&/Expression [::lambda (list ?name $module) ?env ?args ?body] =value-type]
-
- _
- =value))
+ (exec [module-name &util/get-module-name]
+ (if-m (&&env/defined? module-name ?name)
+ (fail (str "Can't redefine " ?name))
+ (exec [=value (&/analyse-1 analyse ?value)
+ =value (match =value
+ [::&/Expression =value-form =value-type]
+ (return (match =value-form
+ [::&/lambda ?old-scope ?env ?args ?body]
+ [::&/Expression [::&/lambda (list module-name ?name) ?env ?args ?body] =value-type]
+
+ _
+ =value))
- _
- (fail ""))
- =value-type (&/expr-type =value)
- _ (if ann??
- (return nil)
- (&&env/annotate ?name ::public false =value-type))
- _ (&&env/define ?name)]
- (return (list [::&/Statement [::def ?name =value]]))))))
+ _
+ (fail ""))
+ =value-type (&/expr-type =value)
+ _ (if-m (&&env/annotated? module-name ?name)
+ (return nil)
+ (&&env/annotate module-name ?name :public =value-type))
+ _ (&&env/define module-name ?name)]
+ (return (list [::&/Statement [::&/def ?name =value]]))))))
(defn analyse-declare-macro [?ident]
- (exec [_ (&&env/annotate ?ident ::public true [::&type/Any])]
+ (exec [_ (&&env/annotate ?ident :public [::&type/Any])]
(return (list))))
(defn analyse-require [analyse ?path]