diff options
author | Eduardo Julian | 2014-12-12 19:07:58 -0400 |
---|---|---|
committer | Eduardo Julian | 2014-12-12 19:07:58 -0400 |
commit | 8f5cd3917fd3a94ae99710a614dce9028f9afad8 (patch) | |
tree | 3a6b14a058ddebb1673042846fe05dd2ff195468 /src/lang/analyser.clj | |
parent | 5b4e9f024b19f5f246d3ddeb3d7e5f5b53d4ac47 (diff) |
Added let (local vars).
Diffstat (limited to 'src/lang/analyser.clj')
-rw-r--r-- | src/lang/analyser.clj | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/lang/analyser.clj b/src/lang/analyser.clj index 98543e13e..811cc93ea 100644 --- a/src/lang/analyser.clj +++ b/src/lang/analyser.clj @@ -24,6 +24,10 @@ (assoc-in [:defs (:name state) name] desc) (assoc-in [:env :mappings name] (annotated [::global (:name state) name] (:type desc)))) nil]])) +(def ^:private next-local-idx + (fn [state] + [::&util/ok [state (-> state :env :counter)]])) + (defn ^:private with-local [name type body] (fn [state] (let [=return (body (update-in state [:env] #(-> % @@ -108,6 +112,14 @@ =else (analyse-form* ?else)] (return (annotated [::if =test =then =else] ::&type/nothing)))) +(defanalyser analyse-let + [::&parser/let ?label ?value ?body] + (exec [=value (analyse-form* ?value) + idx next-local-idx + =body (with-local ?label =value + (analyse-form* ?body))] + (return (annotated [::let idx ?label =value =body] (:type =body))))) + (defanalyser analyse-defclass [::&parser/defclass ?name ?fields] (let [=members {:fields (into {} (for [[class field] ?fields] @@ -176,6 +188,7 @@ analyse-dynamic-access analyse-fn-call analyse-if + analyse-let analyse-defclass analyse-definterface analyse-def |