aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--luxc/src/lux/analyser.clj17
-rw-r--r--new-luxc/source/luxc/lang/syntax.lux11
-rw-r--r--new-luxc/source/luxc/lang/translation.lux42
-rw-r--r--stdlib/source/lux.lux2
4 files changed, 46 insertions, 26 deletions
diff --git a/luxc/src/lux/analyser.clj b/luxc/src/lux/analyser.clj
index 6fc5986ac..13bf3bc61 100644
--- a/luxc/src/lux/analyser.clj
+++ b/luxc/src/lux/analyser.clj
@@ -157,6 +157,11 @@
(&/with-analysis-meta cursor exo-type
(&&lux/analyse-function analyse exo-type ?self ?arg ?body)))
+ "lux module"
+ (|let [(&/$Cons ?meta (&/$Nil)) parameters]
+ (&/with-cursor cursor
+ (&&lux/analyse-module analyse optimize eval! compile-module ?meta)))
+
;; else
(&/with-analysis-meta cursor exo-type
(cond (.startsWith ^String ?procedure "jvm")
@@ -170,18 +175,6 @@
:else
(&&common/analyse-proc analyse exo-type ?procedure parameters))))
- (&/$Symbol _ command-name)
- (case command-name
- "_lux_module"
- (|let [(&/$Cons ?meta (&/$Nil)) parameters]
- (&/with-cursor cursor
- (&&lux/analyse-module analyse optimize eval! compile-module ?meta)))
-
- ;; else
- (&/with-cursor cursor
- (|do [=fn (just-analyse analyse (&/T [command-meta command]))]
- (&&lux/analyse-apply analyse cursor exo-type macro-caller =fn parameters))))
-
(&/$Nat idx)
(&/with-analysis-meta cursor exo-type
(&&lux/analyse-variant analyse (&/$Right exo-type) idx nil parameters))
diff --git a/new-luxc/source/luxc/lang/syntax.lux b/new-luxc/source/luxc/lang/syntax.lux
index 2d8cb364a..9fe4939a2 100644
--- a/new-luxc/source/luxc/lang/syntax.lux
+++ b/new-luxc/source/luxc/lang/syntax.lux
@@ -27,7 +27,8 @@
(;module:
lux
(lux (control monad
- ["p" parser "p/" Monad<Parser>])
+ ["p" parser "p/" Monad<Parser>]
+ ["ex" exception #+ exception:])
(data [bool]
[text]
["e" error]
@@ -584,6 +585,9 @@
[tag #;Tag (p;after (l;this "#") (ident^ current-module)) +1]
)
+(exception: #export End-Of-File)
+(exception: #export Unrecognized-Input)
+
(def: (ast current-module)
(-> Text Cursor (l;Lexer [Cursor Code]))
(: (-> Cursor (l;Lexer [Cursor Code]))
@@ -602,6 +606,11 @@
(symbol current-module where)
(tag current-module where)
(text where)
+ (do @
+ [end? l;end?]
+ (if end?
+ (p;fail (End-Of-File current-module))
+ (p;fail (Unrecognized-Input current-module))))
)))))
(def: #export (parse current-module [where offset source])
diff --git a/new-luxc/source/luxc/lang/translation.lux b/new-luxc/source/luxc/lang/translation.lux
index 62b56783c..5b11a8e39 100644
--- a/new-luxc/source/luxc/lang/translation.lux
+++ b/new-luxc/source/luxc/lang/translation.lux
@@ -14,7 +14,8 @@
(world [file #+ File]))
(luxc ["&" base]
[";L" host]
- (host [";H" macro])
+ (host [";H" macro]
+ ["$" jvm])
["&;" io]
["&;" module]
["&;" eval]
@@ -73,20 +74,26 @@
([#;UnivQ] [#;ExQ])
))
+(def: (process-annotations annsC)
+ (-> Code (Meta [$;Inst Code]))
+ (do meta;Monad<Meta>
+ [[_ annsA] (&;with-scope
+ (&;with-expected-type Code
+ (analyse annsC)))
+ annsI (expressionT;translate (expressionS;synthesize annsA))
+ annsV (evalT;eval annsI)]
+ (wrap [annsI (:! Code annsV)])))
+
(def: (translate code)
(-> Code (Meta Unit))
(case code
- (^code ("lux def" (~ [_ (#;Symbol ["" def-name])]) (~ valueC) (~ metaC)))
+ (^code ("lux def" (~ [_ (#;Symbol ["" def-name])]) (~ valueC) (~ annsC)))
(hostL;with-context def-name
(&;with-fresh-type-env
(do meta;Monad<Meta>
- [[_ metaA] (&;with-scope
- (&;with-expected-type Code
- (analyse metaC)))
- metaI (expressionT;translate (expressionS;synthesize metaA))
- metaV (evalT;eval metaI)
+ [[annsI annsV] (process-annotations annsC)
[_ valueT valueA] (&;with-scope
- (if (meta;type? (:! Code metaV))
+ (if (meta;type? (:! Code annsV))
(do @
[valueA (&;with-expected-type Type
(analyse valueC))]
@@ -97,7 +104,7 @@
(clean valueT))
valueI (expressionT;translate (expressionS;synthesize valueA))
_ (&;with-scope
- (statementT;translate-def def-name valueT valueI metaI (:! Code metaV)))]
+ (statementT;translate-def def-name valueT valueI annsI annsV))]
(wrap []))))
(^code ("lux program" (~ [_ (#;Symbol ["" program-args])]) (~ programC)))
@@ -108,6 +115,11 @@
programI (expressionT;translate (expressionS;synthesize programA))]
(statementT;translate-program program-args programI))
+ (^code ("lux module" (~ annsC)))
+ (do meta;Monad<Meta>
+ [[annsI annsV] (process-annotations annsC)]
+ (&;fail (%code annsV)))
+
(^code ((~ [_ (#;Symbol macro-name)]) (~@ args)))
(do meta;Monad<Meta>
[macro-name (meta;normalize macro-name)
@@ -130,9 +142,15 @@
(def: (exhaust action)
(All [a] (-> (Meta a) (Meta Unit)))
- (do meta;Monad<Meta>
- [result action]
- (exhaust action)))
+ (function [compiler]
+ (case (action compiler)
+ (#e;Success [compiler' _])
+ ((exhaust action) compiler')
+
+ (#e;Error error)
+ (if (ex;match? &syntax;End-Of-File error)
+ (#e;Success [compiler []])
+ (#e;Error error)))))
(def: prelude Text "lux")
diff --git a/stdlib/source/lux.lux b/stdlib/source/lux.lux
index d70318f83..407e895a3 100644
--- a/stdlib/source/lux.lux
+++ b/stdlib/source/lux.lux
@@ -4788,7 +4788,7 @@
imports)
=meta (process-def-meta (list& [(` #;imports) (` [(~@ =imports)])]
_meta))
- =module (` (;_lux_module [(~ cursor-code)
+ =module (` ("lux module" [(~ cursor-code)
(#;Record (~ =meta))]))]]
(wrap (#;Cons =module =refers))))