diff options
Diffstat (limited to 'src/lux/analyser/lux.clj')
-rw-r--r-- | src/lux/analyser/lux.clj | 81 |
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] |