aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--luxc/src/lux/analyser.clj8
-rw-r--r--luxc/src/lux/analyser/lux.clj20
-rw-r--r--stdlib/source/lux.lux7
-rw-r--r--stdlib/source/lux/tool/compiler/phase/extension/statement.lux24
4 files changed, 46 insertions, 13 deletions
diff --git a/luxc/src/lux/analyser.clj b/luxc/src/lux/analyser.clj
index 068a321d0..e272bcea4 100644
--- a/luxc/src/lux/analyser.clj
+++ b/luxc/src/lux/analyser.clj
@@ -136,6 +136,14 @@
(&/with-cursor cursor
(&&lux/analyse-def analyse optimize eval! compile-def ?name ?value ?meta)))
+ "lux def alias"
+ (|let [(&/$Cons [_ (&/$Identifier "" ?alias)]
+ (&/$Cons [_ (&/$Identifier ?original)]
+ (&/$Nil)
+ )) parameters]
+ (&/with-cursor cursor
+ (&&lux/analyse-def-alias ?alias ?original)))
+
"lux program"
(|let [(&/$Cons ?program (&/$Nil)) parameters]
(&/with-cursor cursor
diff --git a/luxc/src/lux/analyser/lux.clj b/luxc/src/lux/analyser/lux.clj
index 236eb10a9..dc08ac765 100644
--- a/luxc/src/lux/analyser/lux.clj
+++ b/luxc/src/lux/analyser/lux.clj
@@ -559,6 +559,26 @@
_ &type/reset-mappings]
(return &/$Nil)))
+(def ^:private dummy-cursor
+ (&/T ["" -1 -1]))
+
+(defn ^:private alias-annotations [original-module original-name]
+ (&/T [dummy-cursor
+ (&/$Record (&/$Cons (&/T [(&/T [dummy-cursor (&/$Tag &&meta/alias-tag)])
+ (&/T [dummy-cursor (&/$Identifier (&/T [original-module original-name]))])])
+ &/$Nil))]))
+
+(defn analyse-def-alias [?alias ?original]
+ (|let [[r-module r-name] ?original]
+ (|do [[_ [original-type original-anns original-value]] (&&module/find-def! r-module r-name)
+ module-name &/get-module-name
+ _ (&/without-repl-closure
+ (&&module/define module-name ?alias
+ original-type
+ (alias-annotations r-module r-name)
+ original-value))]
+ (return &/$Nil))))
+
(defn ^:private merge-module-states
"(-> Host Host Host)"
[new old]
diff --git a/stdlib/source/lux.lux b/stdlib/source/lux.lux
index 2b99f51f8..549d63112 100644
--- a/stdlib/source/lux.lux
+++ b/stdlib/source/lux.lux
@@ -4841,12 +4841,7 @@
(wrap (list)))
#let [defs (list;map (: (-> Text Code)
(function (_ def)
- (` ("lux def" (~ (identifier$ ["" def]))
- (~ (identifier$ [module-name def]))
- [(~ cursor-code)
- (#.Record (#Cons [[(~ cursor-code) (#.Tag ["lux" "alias"])]
- [(~ cursor-code) (#.Identifier [(~ (text$ module-name)) (~ (text$ def))])]]
- #Nil))]))))
+ (` ("lux def alias" (~ (identifier$ ["" def])) (~ (identifier$ [module-name def]))))))
defs')
openings (join-map (: (-> Openings (List Code))
(function (_ [alias structs])
diff --git a/stdlib/source/lux/tool/compiler/phase/extension/statement.lux b/stdlib/source/lux/tool/compiler/phase/extension/statement.lux
index e36af0de6..e8910a3fb 100644
--- a/stdlib/source/lux/tool/compiler/phase/extension/statement.lux
+++ b/stdlib/source/lux/tool/compiler/phase/extension/statement.lux
@@ -11,6 +11,7 @@
["." list ("#;." functor)]
["." dictionary]]]
["." macro
+ ["." code]
["s" syntax (#+ Syntax)]]
[type (#+ :share :by-example)
["." check]]]
@@ -145,12 +146,6 @@
_
(///.throw //.invalid-syntax [extension-name]))))
-(def: (alias! alias def-name)
- (-> Text Name (////analysis.Operation Any))
- (do ///.monad
- [definition (//.lift (macro.find-def def-name))]
- (module.define alias definition)))
-
(def: imports
(Syntax (List Import))
(|> (s.tuple (p.and s.text s.text))
@@ -187,6 +182,21 @@
_
(///.throw //.invalid-syntax [extension-name]))))
+## TODO: Reify aliasing as a feature of the compiler, instead of
+## manifesting it implicitly through definition annotations.
+(def: (alias-annotations original)
+ (-> Name Code)
+ (` {#.alias (~ (code.identifier original))}))
+
+(def: (define-alias alias original)
+ (-> Text Name (////analysis.Operation Any))
+ (do ///.monad
+ [[original-type original-annotations original-value]
+ (//.lift (macro.find-def original))]
+ (module.define alias [original-type
+ (alias-annotations original)
+ original-value])))
+
(def: def::alias
Handler
(function (_ extension-name phase inputsC+)
@@ -196,7 +206,7 @@
[_ (//.lift
(///.sub [(get@ [#////statement.analysis #////statement.state])
(set@ [#////statement.analysis #////statement.state])]
- (alias! alias def-name)))]
+ (define-alias alias def-name)))]
(wrap ////statement.no-requirements))
_