From 00d5ccbc043960037f644d4ff09b6a46fd0093d0 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 12 Oct 2020 20:22:31 -0400 Subject: Type-checking macros via the Macro' type from the standard library. --- luxc/src/lux/analyser/module.clj | 4 +--- luxc/src/lux/analyser/proc/common.clj | 8 +++++--- luxc/src/lux/base.clj | 3 +++ luxc/src/lux/compiler/jvm.clj | 2 +- luxc/src/lux/lexer.clj | 2 +- luxc/src/lux/type.clj | 3 --- 6 files changed, 11 insertions(+), 11 deletions(-) (limited to 'luxc/src') diff --git a/luxc/src/lux/analyser/module.clj b/luxc/src/lux/analyser/module.clj index 3d53155cb..d41eb73d5 100644 --- a/luxc/src/lux/analyser/module.clj +++ b/luxc/src/lux/analyser/module.clj @@ -126,8 +126,6 @@ (defn define [module name exported? def-type def-meta def-value] (fn [state] - (when (and (= "Macro'" name) (= "lux" module)) - (&type/set-macro*-type! def-value)) (|case (&/get$ &/$scopes state) (&/$Cons ?env (&/$Nil)) (return* (->> state @@ -264,7 +262,7 @@ (&/$Right [exported? ?type ?meta ?value]) (if (or (.equals ^Object current-module module) (and exported? - (or (.equals ^Object module "lux") + (or (.equals ^Object module &/prelude) (imports? state module current-module)))) (return* state (&/T [(&/T [module name]) (&/T [exported? ?type ?meta ?value])])) diff --git a/luxc/src/lux/analyser/proc/common.clj b/luxc/src/lux/analyser/proc/common.clj index 8cdcea970..267ea3465 100644 --- a/luxc/src/lux/analyser/proc/common.clj +++ b/luxc/src/lux/analyser/proc/common.clj @@ -4,7 +4,8 @@ clojure.core.match.array (lux [base :as & :refer [|let |do return* return |case assert!]] [type :as &type]) - (lux.analyser [base :as &&]))) + (lux.analyser [base :as &&] + [module :as &&module]))) (defn- analyse-lux-is [analyse exo-type ?values] (&type/with-var @@ -31,7 +32,8 @@ (defn- analyse-lux-macro [analyse exo-type ?values] (|do [:let [(&/$Cons macro (&/$Nil)) ?values] - [[=macro*-type =location] =macro] (&&/analyse-1 analyse &type/Macro* macro) + [_real-name [_exported? _def-type _meta macro-type]] (&&module/find-def! &/prelude "Macro'") + [[=macro*-type =location] =macro] (&&/analyse-1 analyse macro-type macro) _ (&type/check exo-type &type/Macro)] (return (&/|list (&&/|meta exo-type =location =macro))))) @@ -257,7 +259,7 @@ (try (case proc "lux is" (analyse-lux-is analyse exo-type ?values) "lux try" (analyse-lux-try analyse exo-type ?values) - "lux macro" (analyse-lux-macro analyse exo-type ?values) + "lux macro" (analyse-lux-macro analyse exo-type ?values) "lux io log" (analyse-io-log analyse exo-type ?values) "lux io error" (analyse-io-error analyse exo-type ?values) diff --git a/luxc/src/lux/base.clj b/luxc/src/lux/base.clj index cc109b0f7..5ef710a03 100644 --- a/luxc/src/lux/base.clj +++ b/luxc/src/lux/base.clj @@ -4,6 +4,9 @@ [clojure.core.match :as M :refer [matchv]] clojure.core.match.array)) +(def prelude + "lux") + (def !log! (atom false)) (defn flag-prn! [& args] (when @!log! diff --git a/luxc/src/lux/compiler/jvm.clj b/luxc/src/lux/compiler/jvm.clj index e1a51b73a..07c28dfac 100644 --- a/luxc/src/lux/compiler/jvm.clj +++ b/luxc/src/lux/compiler/jvm.clj @@ -157,7 +157,7 @@ (let [compile-expression* (partial compile-expression nil)] (&/T [(partial &&lux/compile-def compile-expression) (partial &&lux/compile-program compile-expression*) - (fn [macro args state] (-> macro (.apply args) (.apply state))) + (fn [macro args state] (.apply macro args state)) (partial &&proc-host/compile-jvm-class compile-expression*) &&proc-host/compile-jvm-interface]))) diff --git a/luxc/src/lux/lexer.clj b/luxc/src/lux/lexer.clj index 962e1e9bd..49e29710a 100644 --- a/luxc/src/lux/lexer.clj +++ b/luxc/src/lux/lexer.clj @@ -88,7 +88,7 @@ (return (&/T [meta (&/T [module-name token])]))) (|do [[meta _ _] (&reader/read-text &/+name-separator+) [_ _ token] (&reader/read-regex +ident-re+)] - (return (&/T [meta (&/T ["lux" token])]))) + (return (&/T [meta (&/T [&/prelude token])]))) ))) (def ^:private lex-identifier diff --git a/luxc/src/lux/type.clj b/luxc/src/lux/type.clj index 924489a53..8853224b5 100644 --- a/luxc/src/lux/type.clj +++ b/luxc/src/lux/type.clj @@ -168,9 +168,6 @@ (let [w (&/$Apply Location Meta)] (&/$Apply (&/$Apply w Code*) w)))) -(def Macro*) -(defn set-macro*-type! [type] (def Macro* type)) - (def Macro (&/$Named (&/T ["lux" "Macro"]) (&/$Primitive "#Macro" &/$Nil))) -- cgit v1.2.3