diff options
Diffstat (limited to 'src/lux/analyser.clj')
-rw-r--r-- | src/lux/analyser.clj | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/lux/analyser.clj b/src/lux/analyser.clj index c5fabb409..03b217f85 100644 --- a/src/lux/analyser.clj +++ b/src/lux/analyser.clj @@ -54,7 +54,7 @@ (fn [state] (fail* (add-loc (&/get$ &/$cursor state) msg)))) -(defn ^:private aba1 [analyse eval! compile-module compilers exo-type token] +(defn ^:private aba1 [analyse optimize eval! compile-module compilers exo-type token] (|let [[compile-def compile-program compile-class compile-interface] compilers] (|case token ;; Standard special forms @@ -112,7 +112,7 @@ (&/$Cons ?meta (&/$Nil)) )))) - (&&lux/analyse-def analyse eval! compile-def ?name ?value ?meta) + (&&lux/analyse-def analyse optimize eval! compile-def ?name ?value ?meta) (&/$FormS (&/$Cons [_ (&/$SymbolS _ "_lux_import")] (&/$Cons [_ (&/$TextS ?path)] @@ -149,17 +149,17 @@ (&/$Cons [_ (&/$SymbolS "" ?args)] (&/$Cons ?body (&/$Nil))))) - (&&lux/analyse-program analyse compile-program ?args ?body) + (&&lux/analyse-program analyse optimize compile-program ?args ?body) _ (fail-with-loc (str "[Analyser Error] Unknown syntax: " (prn-str (&/show-ast (&/T [(&/T ["" -1 -1]) token]))))) ))) -(defn ^:private analyse-basic-ast [analyse eval! compile-module compilers exo-type token] +(defn ^:private analyse-basic-ast [analyse optimize eval! compile-module compilers exo-type token] (|case token [meta ?token] (fn [state] - (|case ((aba1 analyse eval! compile-module compilers exo-type ?token) state) + (|case ((aba1 analyse optimize eval! compile-module compilers exo-type ?token) state) (&/$Right state* output) (return* state* output) @@ -186,39 +186,40 @@ (return (&&/|meta =output-type ?output-cursor ?output-term)))) )))) -(defn ^:private analyse-ast [eval! compile-module compilers exo-type token] - (|let [[cursor _] token] +(defn ^:private analyse-ast [optimize eval! compile-module compilers exo-type token] + (|let [[cursor _] token + analyser (partial analyse-ast optimize eval! compile-module compilers)] (&/with-cursor cursor (&/with-expected-type exo-type (|case token [meta (&/$FormS (&/$Cons [_ (&/$IntS idx)] ?values))] - (&&lux/analyse-variant (partial analyse-ast eval! compile-module compilers) (&/$Right exo-type) idx nil ?values) + (&&lux/analyse-variant analyser (&/$Right exo-type) idx nil ?values) [meta (&/$FormS (&/$Cons [_ (&/$TagS ?ident)] ?values))] - (analyse-variant+ (partial analyse-ast eval! compile-module compilers) exo-type ?ident ?values) + (analyse-variant+ analyser exo-type ?ident ?values) [meta (&/$FormS (&/$Cons ?fn ?args))] (|case ?fn [_ (&/$SymbolS _)] (fn [state] - (|case ((just-analyse (partial analyse-ast eval! compile-module compilers) ?fn) state) + (|case ((just-analyse analyser ?fn) state) (&/$Right state* =fn) - ((&&lux/analyse-apply (partial analyse-ast eval! compile-module compilers) exo-type =fn ?args) state*) + ((&&lux/analyse-apply analyser exo-type =fn ?args) state*) _ - ((analyse-basic-ast (partial analyse-ast eval! compile-module compilers) eval! compile-module compilers exo-type token) state))) + ((analyse-basic-ast analyser optimize eval! compile-module compilers exo-type token) state))) _ - (|do [=fn (just-analyse (partial analyse-ast eval! compile-module compilers) ?fn)] - (&&lux/analyse-apply (partial analyse-ast eval! compile-module compilers) exo-type =fn ?args))) + (|do [=fn (just-analyse analyser ?fn)] + (&&lux/analyse-apply analyser exo-type =fn ?args))) _ - (analyse-basic-ast (partial analyse-ast eval! compile-module compilers) eval! compile-module compilers exo-type token)))))) + (analyse-basic-ast analyser optimize eval! compile-module compilers exo-type token)))))) ;; [Resources] -(defn analyse [eval! compile-module compilers] +(defn analyse [optimize eval! compile-module compilers] (|do [asts &parser/parse] - (&/flat-map% (partial analyse-ast eval! compile-module compilers &/$VoidT) asts))) + (&/flat-map% (partial analyse-ast optimize eval! compile-module compilers &/$VoidT) asts))) (defn clean-output [?var analysis] (|do [:let [[[?output-type ?output-cursor] ?output-term] analysis] |