From 8db393f50d8cb69d8bb46e7891bc4c0448e42a20 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 13 Jul 2016 14:58:00 -0400 Subject: - Optimized the type-checker slightly by now using a 2-tuple for the results, but instead just returning the fixpoints. --- src/lux/type.clj | 38 ++++++++++++++++++-------------------- src/lux/type/host.clj | 9 +++++---- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/lux/type.clj b/src/lux/type.clj index 4661b3166..2729b92e8 100644 --- a/src/lux/type.clj +++ b/src/lux/type.clj @@ -627,12 +627,12 @@ (defn ^:private check* [class-loader fixpoints invariant?? expected actual] (if (clojure.lang.Util/identical expected actual) - (return (&/T [fixpoints nil])) + (return fixpoints) (&/with-attempt (|case [expected actual] [(&/$VarT ?eid) (&/$VarT ?aid)] (if (.equals ^Object ?eid ?aid) - (return (&/T [fixpoints nil])) + (return fixpoints) (|do [ebound (fn [state] (|case ((deref ?eid) state) (&/$Right state* ebound) @@ -650,7 +650,7 @@ (|case [ebound abound] [(&/$None _) (&/$None _)] (|do [_ (set-var ?eid actual)] - (return (&/T [fixpoints nil]))) + (return fixpoints)) [(&/$Some etype) (&/$None _)] (check* class-loader fixpoints invariant?? etype actual) @@ -665,7 +665,7 @@ (fn [state] (|case ((set-var ?id actual) state) (&/$Right state* _) - (return* state* (&/T [fixpoints nil])) + (return* state* fixpoints) (&/$Left _) ((|do [bound (deref ?id)] @@ -676,7 +676,7 @@ (fn [state] (|case ((set-var ?id expected) state) (&/$Right state* _) - (return* state* (&/T [fixpoints nil])) + (return* state* fixpoints) (&/$Left _) ((|do [bound (deref ?id)] @@ -697,11 +697,10 @@ (return* state* output) (&/$Left _) - ((|do [[fixpoints* _] (check* class-loader fixpoints invariant?? (&/$VarT ?id) F2) + ((|do [fixpoints* (check* class-loader fixpoints invariant?? (&/$VarT ?id) F2) e* (apply-type F2 A1) - a* (apply-type F2 A2) - [fixpoints** _] (check* class-loader fixpoints* invariant?? e* a*)] - (return (&/T [fixpoints** nil]))) + a* (apply-type F2 A2)] + (check* class-loader fixpoints* invariant?? e* a*)) state))) [(&/$AppT F1 A1) (&/$AppT (&/$VarT ?id) A2)] @@ -713,11 +712,10 @@ (return* state* output) (&/$Left _) - ((|do [[fixpoints* _] (check* class-loader fixpoints invariant?? F1 (&/$VarT ?id)) + ((|do [fixpoints* (check* class-loader fixpoints invariant?? F1 (&/$VarT ?id)) e* (apply-type F1 A1) - a* (apply-type F1 A2) - [fixpoints** _] (check* class-loader fixpoints* invariant?? e* a*)] - (return (&/T [fixpoints** nil]))) + a* (apply-type F1 A2)] + (check* class-loader fixpoints* invariant?? e* a*)) state))) [(&/$AppT F A) _] @@ -734,7 +732,7 @@ (|case (fp-get fp-pair fixpoints) (&/$Some ?) (if ? - (return (&/T [fixpoints nil])) + (return fixpoints) (check-error "" expected actual)) (&/$None) @@ -782,26 +780,26 @@ a!data) [(&/$VoidT) (&/$VoidT)] - (return (&/T [fixpoints nil])) + (return fixpoints) [(&/$UnitT) (&/$UnitT)] - (return (&/T [fixpoints nil])) + (return fixpoints) [(&/$LambdaT eI eO) (&/$LambdaT aI aO)] - (|do [[fixpoints* _] (check* class-loader fixpoints invariant?? aI eI)] + (|do [fixpoints* (check* class-loader fixpoints invariant?? aI eI)] (check* class-loader fixpoints* invariant?? eO aO)) [(&/$ProdT eL eR) (&/$ProdT aL aR)] - (|do [[fixpoints* _] (check* class-loader fixpoints invariant?? eL aL)] + (|do [fixpoints* (check* class-loader fixpoints invariant?? eL aL)] (check* class-loader fixpoints* invariant?? eR aR)) [(&/$SumT eL eR) (&/$SumT aL aR)] - (|do [[fixpoints* _] (check* class-loader fixpoints invariant?? eL aL)] + (|do [fixpoints* (check* class-loader fixpoints invariant?? eL aL)] (check* class-loader fixpoints* invariant?? eR aR)) [(&/$ExT e!id) (&/$ExT a!id)] (if (.equals ^Object e!id a!id) - (return (&/T [fixpoints nil])) + (return fixpoints) (check-error "" expected actual)) [(&/$NamedT ?ename ?etype) _] diff --git a/src/lux/type/host.clj b/src/lux/type/host.clj index 340d805a2..b3858d2e5 100644 --- a/src/lux/type/host.clj +++ b/src/lux/type/host.clj @@ -250,17 +250,18 @@ (defn check-host-types [check check-error fixpoints existential class-loader invariant?? expected actual] (|let [[e!name e!params] expected [a!name a!params] actual] + ;; TODO: Delete first branch. It smells like a hack... (try (cond (= "java.lang.Object" e!name) - (return (&/T [fixpoints nil])) + (return fixpoints) (= null-data-tag a!name) (if (not (primitive-type? e!name)) - (return (&/T [fixpoints nil])) + (return fixpoints) (check-error "" (&/$HostT e!name e!params) (&/$HostT a!name a!params))) (= null-data-tag e!name) (if (= null-data-tag a!name) - (return (&/T [fixpoints nil])) + (return fixpoints) (check-error "" (&/$HostT e!name e!params) (&/$HostT a!name a!params))) (and (= array-data-tag e!name) @@ -273,7 +274,7 @@ (cond (.equals ^Object e!name a!name) (if (= (&/|length e!params) (&/|length a!params)) (|do [_ (&/map2% check e!params a!params)] - (return (&/T [fixpoints nil]))) + (return fixpoints)) (fail (str "[Type Error] Amounts of generic parameters don't match: " e!name "(" (&/|length e!params) ")" " vs " a!name "(" (&/|length a!params) ")"))) (not invariant??) -- cgit v1.2.3