aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/lux.lux2073
1 files changed, 1086 insertions, 987 deletions
diff --git a/stdlib/source/lux.lux b/stdlib/source/lux.lux
index 480bc3468..3c1edac4b 100644
--- a/stdlib/source/lux.lux
+++ b/stdlib/source/lux.lux
@@ -1,116 +1,172 @@
## Basic types
+(_lux_def dummy-cursor
+ (_lux_: (+4 (+0 "#Text" (+0)) (+4 (+0 "#Nat" (+0)) (+0 "#Nat" (+0))))
+ ["" +0 +0])
+ [["" +0 +0]
+ (+10 (+1 [[["" +0 +0] (+7 ["lux" "export?"])]
+ [["" +0 +0] (+0 true)]]
+ (+0)))])
+
+## (type: (List a)
+## #Nil
+## (#Cons a (List a)))
+(_lux_def List
+ (+12 ["lux" "List"]
+ (+9 (+0)
+ (+3 ## "lux;Nil"
+ (+2)
+ ## "lux;Cons"
+ (+4 (+6 +1)
+ (+11 (+6 +1) (+6 +0))))))
+ [dummy-cursor
+ (+10 (+1 [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (+1 [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (+1 [[dummy-cursor (+7 ["lux" "tags"])]
+ [dummy-cursor (+9 (+1 [dummy-cursor (+5 "Nil")] (+1 [dummy-cursor (+5 "Cons")] (+0))))]]
+ (+1 [[dummy-cursor (+7 ["lux" "type-args"])]
+ [dummy-cursor (+9 (+1 [dummy-cursor (+5 "a")] (+0)))]]
+ (+1 [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "A potentially empty list of values.")]]
+ (+0)))))))])
+
(_lux_def Bool
(+12 ["lux" "Bool"]
- (+0 "#Bool" (+0)))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "Your standard, run-of-the-mill boolean values.")]
- (+0)))))
+ (+0 "#Bool" #Nil))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Your standard, run-of-the-mill boolean values.")]]
+ #Nil))))])
(_lux_def Nat
(+12 ["lux" "Nat"]
- (+0 "#Nat" (+0)))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "Natural numbers (unsigned integers).
-
- They start at zero (+0) and extend in the positive direction.")]
- (+0)))))
+ (+0 "#Nat" #Nil))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Natural numbers (unsigned integers).
+
+ They start at zero (+0) and extend in the positive direction.")]]
+ #Nil))))])
(_lux_def Int
(+12 ["lux" "Int"]
- (+0 "#Int" (+0)))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "Your standard, run-of-the-mill integer numbers.")]
- (+0)))))
+ (+0 "#Int" #Nil))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Your standard, run-of-the-mill integer numbers.")]]
+ #Nil))))])
(_lux_def Frac
(+12 ["lux" "Frac"]
- (+0 "#Frac" (+0)))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "Your standard, run-of-the-mill floating-point numbers.")]
- (+0)))))
+ (+0 "#Frac" #Nil))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Your standard, run-of-the-mill floating-point (fractional) numbers.")]]
+ #Nil))))])
(_lux_def Deg
(+12 ["lux" "Deg"]
- (+0 "#Deg" (+0)))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "Fractional numbers that live in the interval [0,1).
-
- Useful for probability, and other domains that work within that interval.")]
- (+0)))))
+ (+0 "#Deg" #Nil))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Fractional numbers that live in the interval [0,1).
+
+ Useful for probability, and other domains that work within that interval.")]]
+ #Nil))))])
(_lux_def Text
(+12 ["lux" "Text"]
- (+0 "#Text" (+0)))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "Your standard, run-of-the-mill string values.")]
- (+0)))))
+ (+0 "#Text" #Nil))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Your standard, run-of-the-mill string values.")]]
+ #Nil))))])
(_lux_def Void
(+12 ["lux" "Void"]
(+1))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "An unusual type that possesses no value, and thus cannot be instantiated.")]
- (+0)))))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "An unusual type that possesses no value, and thus cannot be instantiated.")]]
+ #Nil))))])
(_lux_def Unit
(+12 ["lux" "Unit"]
(+2))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "An unusual type that only possesses a single value: []")]
- (+0)))))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "An unusual type that only possesses a single value: []")]]
+ #Nil))))])
(_lux_def Ident
(+12 ["lux" "Ident"]
(+4 Text Text))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "doc"] (+5 "An identifier.
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "An identifier.
- It is used as part of Lux syntax to represent symbols and tags.")]
- (+0)))))
-
-## (type: (List a)
-## #Nil
-## (#Cons a (List a)))
-(_lux_def List
- (+12 ["lux" "List"]
- (+9 (+0)
- (+3 ## "lux;Nil"
- (+2)
- ## "lux;Cons"
- (+4 (+6 +1)
- (+11 (+6 +1) (+6 +0))))))
- (+1 [["lux" "type?"] (+0 true)]
- (+1 [["lux" "export?"] (+0 true)]
- (+1 [["lux" "tags"] (+7 (+1 (+5 "Nil") (+1 (+5 "Cons") (+0))))]
- (+1 [["lux" "type-args"] (+7 (+1 (+5 "a") (+0)))]
- (+1 [["lux" "doc"] (+5 "A potentially empty list of values.")]
- (+0)))))))
+ It is used as part of Lux syntax to represent symbols and tags.")]]
+ #Nil))))])
## (type: (Maybe a)
## #None
## (#Some a))
(_lux_def Maybe
(+12 ["lux" "Maybe"]
- (+9 (+0)
+ (+9 #Nil
(+3 ## "lux;None"
(+2)
## "lux;Some"
(+6 +1))))
- (#Cons [["lux" "type?"] (+0 true)]
- (#Cons [["lux" "export?"] (+0 true)]
- (#Cons [["lux" "tags"] (+7 (#Cons (+5 "None") (#Cons (+5 "Some") #Nil)))]
- (#Cons [["lux" "type-args"] (+7 (#Cons (+5 "a") #Nil))]
- (#Cons [["lux" "doc"] (+5 "A potentially missing value.")]
- #Nil))))))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "tags"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "None")] (#Cons [dummy-cursor (+5 "Some")] #Nil)))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type-args"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "a")] #Nil))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "A potentially missing value.")]]
+ #Nil))))))])
## (type: #rec Type
## (#Host Text (List Type))
@@ -132,23 +188,23 @@
(_lux_case (+11 (+6 +1) (+6 +0))
Type
(_lux_case (+11 Type List)
- TypeList
+ Type-List
(_lux_case (+4 Type Type)
- TypePair
+ Type-Pair
(+11 Void
(+9 #Nil
(+3 ## "lux;Host"
- (+4 Text TypeList)
+ (+4 Text Type-List)
(+3 ## "lux;Void"
(+2)
(+3 ## "lux;Unit"
(+2)
(+3 ## "lux;Sum"
- TypePair
+ Type-Pair
(+3 ## "lux;Product"
- TypePair
+ Type-Pair
(+3 ## "lux;Function"
- TypePair
+ Type-Pair
(+3 ## "lux;Bound"
Nat
(+3 ## "lux;Var"
@@ -156,158 +212,70 @@
(+3 ## "lux;Ex"
Nat
(+3 ## "lux;UnivQ"
- (+4 TypeList Type)
+ (+4 Type-List Type)
(+3 ## "lux;ExQ"
- (+4 TypeList Type)
+ (+4 Type-List Type)
(+3 ## "lux;App"
- TypePair
+ Type-Pair
## "lux;Named"
(+4 Ident Type)))))))))))))))))))
- (#Cons [["lux" "type?"] (+0 true)]
- (#Cons [["lux" "export?"] (+0 true)]
- (#Cons [["lux" "tags"] (+7 (#Cons (+5 "Host")
- (#Cons (+5 "Void")
- (#Cons (+5 "Unit")
- (#Cons (+5 "Sum")
- (#Cons (+5 "Product")
- (#Cons (+5 "Function")
- (#Cons (+5 "Bound")
- (#Cons (+5 "Var")
- (#Cons (+5 "Ex")
- (#Cons (+5 "UnivQ")
- (#Cons (+5 "ExQ")
- (#Cons (+5 "Apply")
- (#Cons (+5 "Named")
- #Nil))))))))))))))]
- (#Cons [["lux" "doc"] (+5 "This type represents the data-structures that are used to specify types themselves.")]
- (#Cons [["lux" "type-rec?"] (+0 true)]
- #Nil))))))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "tags"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "Host")]
+ (#Cons [dummy-cursor (+5 "Void")]
+ (#Cons [dummy-cursor (+5 "Unit")]
+ (#Cons [dummy-cursor (+5 "Sum")]
+ (#Cons [dummy-cursor (+5 "Product")]
+ (#Cons [dummy-cursor (+5 "Function")]
+ (#Cons [dummy-cursor (+5 "Bound")]
+ (#Cons [dummy-cursor (+5 "Var")]
+ (#Cons [dummy-cursor (+5 "Ex")]
+ (#Cons [dummy-cursor (+5 "UnivQ")]
+ (#Cons [dummy-cursor (+5 "ExQ")]
+ (#Cons [dummy-cursor (+5 "Apply")]
+ (#Cons [dummy-cursor (+5 "Named")]
+ #Nil))))))))))))))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "This type represents the data-structures that are used to specify types themselves.")]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type-rec?"])]
+ [dummy-cursor (+0 true)]]
+ #Nil))))))])
## (type: Top
## (Ex [a] a))
(_lux_def Top
(#Named ["lux" "Top"]
(#ExQ #Nil (#Bound +1)))
- (#Cons [["lux" "type?"] (+0 true)]
- (#Cons [["lux" "export?"] (+0 true)]
- (#Cons [["lux" "doc"] (+5 "The type of things whose type does not matter.
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "The type of things whose type does not matter.
- It can be used to write functions or data-structures that can take, or return, anything.")]
- #Nil))))
+ It can be used to write functions or data-structures that can take, or return, anything.")]]
+ #Nil))))])
## (type: Bottom
## (All [a] a))
(_lux_def Bottom
(#Named ["lux" "Bottom"]
(#UnivQ #Nil (#Bound +1)))
- (#Cons [["lux" "type?"] (+0 true)]
- (#Cons [["lux" "export?"] (+0 true)]
- (#Cons [["lux" "doc"] (+5 "The type of things whose type is unknown or undefined.
-
- Useful for expressions that cause errors or other \"extraordinary\" conditions.")]
- #Nil))))
-
-## (type: #rec Ann-Value
-## (#BoolA Bool)
-## (#NatA Nat)
-## (#IntA Int)
-## (#DegA Deg)
-## (#FracA Frac)
-## (#TextA Text)
-## (#IdentA Ident)
-## (#ListA (List Ann-Value))
-## (#DictA (List [Text Ann-Value])))
-(_lux_def Ann-Value
- (#Named ["lux" "Ann-Value"]
- (_lux_case (#Apply (#Bound +1) (#Bound +0))
- Ann-Value
- (#Apply Void
- (#UnivQ #Nil
- (#Sum ## #BoolA
- Bool
- (#Sum ## #NatA
- Nat
- (#Sum ## #IntA
- Int
- (#Sum ## #DegA
- Deg
- (#Sum ## #FracA
- Frac
- (#Sum ## #TextA
- Text
- (#Sum ## #IdentA
- Ident
- (#Sum ## #ListA
- (#Apply Ann-Value List)
- ## #DictA
- (#Apply (#Product Text Ann-Value) List)))))))))
- ))
- ))
- (#Cons [["lux" "type?"] (+0 true)]
- (#Cons [["lux" "export?"] (+0 true)]
- (#Cons [["lux" "tags"] (+7 (#Cons (+5 "BoolA")
- (#Cons (+5 "NatA")
- (#Cons (+5 "IntA")
- (#Cons (+5 "DegA")
- (#Cons (+5 "FracA")
- (#Cons (+5 "TextA")
- (#Cons (+5 "IdentA")
- (#Cons (+5 "ListA")
- (#Cons (+5 "DictA")
- #Nil))))))))))]
- (#Cons [["lux" "type-rec?"] (+0 true)]
- (#Cons [["lux" "doc"] (+5 "The value of an individual annotation.")]
- #Nil))))))
-
-## (type: Anns
-## (List [Ident Ann-Value]))
-(_lux_def Anns
- (#Named ["lux" "Anns"]
- (#Apply (#Product Ident Ann-Value) List))
- (#Cons [["lux" "type?"] (#BoolA true)]
- (#Cons [["lux" "export?"] (#BoolA true)]
- (#Cons [["lux" "doc"] (#TextA "A set of annotations associated with a definition.")]
- #Nil))))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "The type of things whose type is unknown or undefined.
-(_lux_def default-def-meta-exported
- (_lux_: Anns
- (#Cons [["lux" "type?"] (#BoolA true)]
- (#Cons [["lux" "export?"] (#BoolA true)]
- #Nil)))
- #Nil)
-
-(_lux_def default-def-meta-unexported
- (_lux_: Anns
- (#Cons [["lux" "type?"] (#BoolA true)]
- #Nil))
- #Nil)
-
-## (type: Def
-## [Type Anns Top])
-(_lux_def Def
- (#Named ["lux" "Def"]
- (#Product Type (#Product Anns Top)))
- (#Cons [["lux" "doc"] (#TextA "Represents all the data associated with a definition: its type, its annotations, and its value.")]
- default-def-meta-exported))
-
-## (type: (Bindings k v)
-## {#counter Nat
-## #mappings (List [k v])})
-(_lux_def Bindings
- (#Named ["lux" "Bindings"]
- (#UnivQ #Nil
- (#UnivQ #Nil
- (#Product ## "lux;counter"
- Nat
- ## "lux;mappings"
- (#Apply (#Product (#Bound +3)
- (#Bound +1))
- List)))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "counter")
- (#Cons (#TextA "mappings")
- #Nil)))]
- (#Cons [["lux" "type-args"] (#ListA (#Cons (#TextA "k") (#Cons (#TextA "v") #;Nil)))]
- default-def-meta-exported)))
+ Useful for expressions that cause errors or other \"extraordinary\" conditions.")]]
+ #Nil))))])
## (type: Cursor
## {#module Text
@@ -316,12 +284,19 @@
(_lux_def Cursor
(#Named ["lux" "Cursor"]
(#Product Text (#Product Nat Nat)))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "module")
- (#Cons (#TextA "line")
- (#Cons (#TextA "column")
- #Nil))))]
- (#Cons [["lux" "doc"] (#TextA "Cursors are for specifying the location of Code nodes in Lux files during compilation.")]
- default-def-meta-exported)))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "tags"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "module")]
+ (#Cons [dummy-cursor (+5 "line")]
+ (#Cons [dummy-cursor (+5 "column")]
+ #Nil))))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "Cursors are for specifying the location of Code nodes in Lux files during compilation.")]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ #Nil)))))])
## (type: (Meta m v)
## {#meta m
@@ -332,48 +307,20 @@
(#UnivQ #Nil
(#Product (#Bound +3)
(#Bound +1)))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "meta")
- (#Cons (#TextA "datum")
- #Nil)))]
- (#Cons [["lux" "doc"] (#TextA "The type of things that can have meta-data of arbitrary types.")]
- (#Cons [["lux" "type-args"] (#ListA (#Cons (#TextA "m") (#Cons (#TextA "v") #;Nil)))]
- default-def-meta-exported))))
-
-## (type: #export Ref
-## (#Local Nat)
-## (#Captured Nat))
-(_lux_def Ref
- (#Named ["lux" "Ref"]
- (#Sum ## Local
- Nat
- ## Captured
- Nat))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "Local")
- (#Cons (#TextA "Captured")
- #Nil)))]
- default-def-meta-exported))
-
-## (type: Scope
-## {#name (List Text)
-## #inner Nat
-## #locals (Bindings Text [Type Nat])
-## #captured (Bindings Text [Type Ref])})
-(_lux_def Scope
- (#Named ["lux" "Scope"]
- (#Product ## name
- (#Apply Text List)
- (#Product ## inner
- Nat
- (#Product ## locals
- (#Apply (#Product Type Nat) (#Apply Text Bindings))
- ## captured
- (#Apply (#Product Type Ref) (#Apply Text Bindings))))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "name")
- (#Cons (#TextA "inner")
- (#Cons (#TextA "locals")
- (#Cons (#TextA "captured")
- #Nil)))))]
- default-def-meta-exported))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "tags"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "meta")]
+ (#Cons [dummy-cursor (+5 "datum")]
+ #Nil)))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "doc"])]
+ [dummy-cursor (+5 "The type of things that can have meta-data of arbitrary types.")]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type-args"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "m")] (#Cons [dummy-cursor (+5 "v")] #;Nil)))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ #Nil))))))])
## (type: (Code' w)
## (#Bool Bool)
@@ -420,20 +367,27 @@
(#Apply (#Product Code Code) List)
))))))))))
))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "Bool")
- (#Cons (#TextA "Nat")
- (#Cons (#TextA "Int")
- (#Cons (#TextA "Deg")
- (#Cons (#TextA "Frac")
- (#Cons (#TextA "Text")
- (#Cons (#TextA "Symbol")
- (#Cons (#TextA "Tag")
- (#Cons (#TextA "Form")
- (#Cons (#TextA "Tuple")
- (#Cons (#TextA "Record")
- #Nil))))))))))))]
- (#Cons [["lux" "type-args"] (#ListA (#Cons (#TextA "w") #;Nil))]
- default-def-meta-exported)))
+ [dummy-cursor
+ (+10 (#Cons [[dummy-cursor (+7 ["lux" "tags"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "Bool")]
+ (#Cons [dummy-cursor (+5 "Nat")]
+ (#Cons [dummy-cursor (+5 "Int")]
+ (#Cons [dummy-cursor (+5 "Deg")]
+ (#Cons [dummy-cursor (+5 "Frac")]
+ (#Cons [dummy-cursor (+5 "Text")]
+ (#Cons [dummy-cursor (+5 "Symbol")]
+ (#Cons [dummy-cursor (+5 "Tag")]
+ (#Cons [dummy-cursor (+5 "Form")]
+ (#Cons [dummy-cursor (+5 "Tuple")]
+ (#Cons [dummy-cursor (+5 "Record")]
+ #Nil))))))))))))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type-args"])]
+ [dummy-cursor (+9 (#Cons [dummy-cursor (+5 "w")] #;Nil))]]
+ (#Cons [[dummy-cursor (+7 ["lux" "type?"])]
+ [dummy-cursor (+0 true)]]
+ (#Cons [[dummy-cursor (+7 ["lux" "export?"])]
+ [dummy-cursor (+0 true)]]
+ #Nil)))))])
## (type: Code
## (Meta Cursor (Code' (Meta Cursor))))
@@ -442,12 +396,157 @@
(_lux_case (#Apply Cursor Meta)
w
(#Apply (#Apply w Code') w)))
- (#Cons [["lux" "doc"] (#TextA "The type of Code nodes for Lux syntax.")]
- default-def-meta-exported))
+ [dummy-cursor
+ (#Record (#Cons [[dummy-cursor (#Tag ["lux" "doc"])]
+ [dummy-cursor (#Text "The type of Code nodes for Lux syntax.")]]
+ (#Cons [[dummy-cursor (#Tag ["lux" "type?"])]
+ [dummy-cursor (#Bool true)]]
+ (#Cons [[dummy-cursor (#Tag ["lux" "export?"])]
+ [dummy-cursor (#Bool true)]]
+ #Nil))))])
+
+(_lux_def _meta
+ (_lux_: (#Function (#Apply (#Apply Cursor Meta)
+ Code')
+ Code)
+ (_lux_function _ data
+ [dummy-cursor data]))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def bool$
+ (_lux_: (#Function Bool Code)
+ (_lux_function _ value (_meta (#Bool value))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def nat$
+ (_lux_: (#Function Nat Code)
+ (_lux_function _ value (_meta (#Nat value))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def int$
+ (_lux_: (#Function Int Code)
+ (_lux_function _ value (_meta (#Int value))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def deg$
+ (_lux_: (#Function Deg Code)
+ (_lux_function _ value (_meta (#Deg value))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def frac$
+ (_lux_: (#Function Frac Code)
+ (_lux_function _ value (_meta (#Frac value))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def text$
+ (_lux_: (#Function Text Code)
+ (_lux_function _ text (_meta (#Text text))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def symbol$
+ (_lux_: (#Function Ident Code)
+ (_lux_function _ ident (_meta (#Symbol ident))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def tag$
+ (_lux_: (#Function Ident Code)
+ (_lux_function _ ident (_meta (#Tag ident))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def form$
+ (_lux_: (#Function (#Apply Code List) Code)
+ (_lux_function _ tokens (_meta (#Form tokens))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def tuple$
+ (_lux_: (#Function (#Apply Code List) Code)
+ (_lux_function _ tokens (_meta (#Tuple tokens))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def record$
+ (_lux_: (#Function (#Apply (#Product Code Code) List) Code)
+ (_lux_function _ tokens (_meta (#Record tokens))))
+ [dummy-cursor (#Record #Nil)])
+
+(_lux_def default-def-meta-exported
+ (_lux_: (#Apply (#Product Code Code) List)
+ (#Cons [(tag$ ["lux" "type?"])
+ (bool$ true)]
+ (#Cons [(tag$ ["lux" "export?"])
+ (bool$ true)]
+ #Nil)))
+ (record$ #Nil))
+
+(_lux_def default-def-meta-unexported
+ (_lux_: (#Apply (#Product Code Code) List)
+ (#Cons [(tag$ ["lux" "type?"])
+ (bool$ true)]
+ #Nil))
+ (record$ #Nil))
+
+## (type: Def
+## [Type Code Top])
+(_lux_def Def
+ (#Named ["lux" "Def"]
+ (#Product Type (#Product Code Top)))
+ (record$ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "Represents all the data associated with a definition: its type, its annotations, and its value.")]
+ default-def-meta-exported)))
+
+## (type: (Bindings k v)
+## {#counter Nat
+## #mappings (List [k v])})
+(_lux_def Bindings
+ (#Named ["lux" "Bindings"]
+ (#UnivQ #Nil
+ (#UnivQ #Nil
+ (#Product ## "lux;counter"
+ Nat
+ ## "lux;mappings"
+ (#Apply (#Product (#Bound +3)
+ (#Bound +1))
+ List)))))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "counter") (#Cons (text$ "mappings") #Nil)))]
+ (#Cons [(tag$ ["lux" "type-args"])
+ (tuple$ (#Cons (text$ "k") (#Cons (text$ "v") #;Nil)))]
+ default-def-meta-exported))))
+
+## (type: #export Ref
+## (#Local Nat)
+## (#Captured Nat))
+(_lux_def Ref
+ (#Named ["lux" "Ref"]
+ (#Sum ## Local
+ Nat
+ ## Captured
+ Nat))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "Local") (#Cons (text$ "Captured") #Nil)))]
+ default-def-meta-exported)))
+
+## (type: Scope
+## {#name (List Text)
+## #inner Nat
+## #locals (Bindings Text [Type Nat])
+## #captured (Bindings Text [Type Ref])})
+(_lux_def Scope
+ (#Named ["lux" "Scope"]
+ (#Product ## name
+ (#Apply Text List)
+ (#Product ## inner
+ Nat
+ (#Product ## locals
+ (#Apply (#Product Type Nat) (#Apply Text Bindings))
+ ## captured
+ (#Apply (#Product Type Ref) (#Apply Text Bindings))))))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "name") (#Cons (text$ "inner") (#Cons (text$ "locals") (#Cons (text$ "captured") #Nil)))))]
+ default-def-meta-exported)))
(_lux_def Code-List
(#Apply Code List)
- default-def-meta-unexported)
+ (record$ default-def-meta-unexported))
## (type: (Either l r)
## (#Left l)
@@ -460,19 +559,20 @@
(#Bound +3)
## "lux;Right"
(#Bound +1)))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "Left")
- (#Cons (#TextA "Right")
- #Nil)))]
- (#Cons [["lux" "type-args"] (#ListA (#Cons (#TextA "l") (#Cons (#TextA "r") #;Nil)))]
- (#Cons [["lux" "doc"] (#TextA "A choice between two values of different types.")]
- default-def-meta-exported))))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "Left") (#Cons (text$ "Right") #Nil)))]
+ (#Cons [(tag$ ["lux" "type-args"])
+ (tuple$ (#Cons (text$ "l") (#Cons (text$ "r") #;Nil)))]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "A choice between two values of different types.")]
+ default-def-meta-exported)))))
## (type: Source
## [Cursor Text])
(_lux_def Source
(#Named ["lux" "Source"]
(#Product Cursor Text))
- default-def-meta-exported)
+ (record$ default-def-meta-exported))
## (type: Module-State
## #Active
@@ -488,11 +588,9 @@
Unit
## #Cached
Unit)))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "Active")
- (#Cons (#TextA "Compiled")
- (#Cons (#TextA "Cached")
- #Nil))))]
- default-def-meta-exported))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "Active") (#Cons (text$ "Compiled") (#Cons (text$ "Cached") #Nil))))]
+ default-def-meta-exported)))
## (type: Module
## {#module-hash Nat
@@ -526,21 +624,23 @@
(#Product Bool
Type)))
List)
- (#Product ## "lux;module-anns"
- Anns
+ (#Product ## "lux;module-annotations"
+ Code
Module-State))
))))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "module-hash")
- (#Cons (#TextA "module-aliases")
- (#Cons (#TextA "defs")
- (#Cons (#TextA "imports")
- (#Cons (#TextA "tags")
- (#Cons (#TextA "types")
- (#Cons (#TextA "module-anns")
- (#Cons (#TextA "module-state")
- #Nil)))))))))]
- (#Cons [["lux" "doc"] (#TextA "All the information contained within a Lux module.")]
- default-def-meta-exported)))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "module-hash")
+ (#Cons (text$ "module-aliases")
+ (#Cons (text$ "defs")
+ (#Cons (text$ "imports")
+ (#Cons (text$ "tags")
+ (#Cons (text$ "types")
+ (#Cons (text$ "module-annotations")
+ (#Cons (text$ "module-state")
+ #Nil)))))))))]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "All the information contained within a Lux module.")]
+ default-def-meta-exported))))
## (type: Type-Context
## {#ex-counter Nat
@@ -555,11 +655,12 @@
## var-bindings
(#Apply (#Product Nat (#Apply Type Maybe))
List))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "ex-counter")
- (#Cons (#TextA "var-counter")
- (#Cons (#TextA "var-bindings")
- #Nil))))]
- default-def-meta-exported))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "ex-counter")
+ (#Cons (text$ "var-counter")
+ (#Cons (text$ "var-bindings")
+ #Nil))))]
+ default-def-meta-exported)))
## (type: Compiler-Mode
## #Build
@@ -573,12 +674,14 @@
#Unit
## REPL
#Unit)))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "Build")
- (#Cons (#TextA "Eval")
- (#Cons (#TextA "REPL")
- #Nil))))]
- (#Cons [["lux" "doc"] (#TextA "A sign that shows the conditions under which the compiler is running.")]
- default-def-meta-exported)))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "Build")
+ (#Cons (text$ "Eval")
+ (#Cons (text$ "REPL")
+ #Nil))))]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "A sign that shows the conditions under which the compiler is running.")]
+ default-def-meta-exported))))
## (type: Compiler-Info
## {#compiler-name Text
@@ -594,12 +697,14 @@
Text
## compiler-mode
Compiler-Mode)))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "compiler-name")
- (#Cons (#TextA "compiler-version")
- (#Cons (#TextA "compiler-mode")
- #Nil))))]
- (#Cons [["lux" "doc"] (#TextA "Information about the current version and type of compiler that is running.")]
- default-def-meta-exported)))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "compiler-name")
+ (#Cons (text$ "compiler-version")
+ (#Cons (text$ "compiler-mode")
+ #Nil))))]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "Information about the current version and type of compiler that is running.")]
+ default-def-meta-exported))))
## (type: Compiler
## {#info Compiler-Info
@@ -634,23 +739,25 @@
(#Apply Nat List)
## "lux;host"
Void))))))))))
- (#Cons [["lux" "tags"] (#ListA (#Cons (#TextA "info")
- (#Cons (#TextA "source")
- (#Cons (#TextA "cursor")
- (#Cons (#TextA "modules")
- (#Cons (#TextA "scopes")
- (#Cons (#TextA "type-context")
- (#Cons (#TextA "expected")
- (#Cons (#TextA "seed")
- (#Cons (#TextA "scope-type-vars")
- (#Cons (#TextA "host")
- #Nil)))))))))))]
- (#Cons [["lux" "doc"] (#TextA "Represents the state of the Lux compiler during a run.
-
- It is provided to macros during their invocation, so they can access compiler data.
-
- Caveat emptor: Avoid fiddling with it, unless you know what you're doing.")]
- default-def-meta-exported)))
+ (record$ (#Cons [(tag$ ["lux" "tags"])
+ (tuple$ (#Cons (text$ "info")
+ (#Cons (text$ "source")
+ (#Cons (text$ "cursor")
+ (#Cons (text$ "modules")
+ (#Cons (text$ "scopes")
+ (#Cons (text$ "type-context")
+ (#Cons (text$ "expected")
+ (#Cons (text$ "seed")
+ (#Cons (text$ "scope-type-vars")
+ (#Cons (text$ "host")
+ #Nil)))))))))))]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "Represents the state of the Lux compiler during a run.
+
+ It is provided to macros during their invocation, so they can access compiler data.
+
+ Caveat emptor: Avoid fiddling with it, unless you know what you're doing.")]
+ default-def-meta-exported))))
## (type: (Lux a)
## (-> Compiler (Either Text [Compiler a])))
@@ -660,34 +767,24 @@
(#Function Compiler
(#Apply (#Product Compiler (#Bound +1))
(#Apply Text Either)))))
- (#Cons [["lux" "doc"] (#TextA "Computations that can have access to the state of the compiler.
+ (record$ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "Computations that can have access to the state of the compiler.
- These computations may fail, or modify the state of the compiler.")]
- (#Cons [["lux" "type-args"] (#ListA (#Cons (#TextA "a") #;Nil))]
- default-def-meta-exported)))
+ These computations may fail, or modify the state of the compiler.")]
+ (#Cons [(tag$ ["lux" "type-args"])
+ (tuple$ (#Cons (text$ "a") #;Nil))]
+ default-def-meta-exported))))
## (type: Macro
## (-> (List Code) (Lux (List Code))))
(_lux_def Macro
(#Named ["lux" "Macro"]
(#Function Code-List (#Apply Code-List Lux)))
- (#Cons [["lux" "doc"] (#TextA "Functions that run at compile-time and allow you to transform and extend the language in powerful ways.")]
- default-def-meta-exported))
+ (record$ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "Functions that run at compile-time and allow you to transform and extend the language in powerful ways.")]
+ default-def-meta-exported)))
## Base functions & macros
-(_lux_def dummy-cursor
- (_lux_: Cursor ["" +0 +0])
- (#Cons [["lux" "export?"] (#BoolA true)]
- #Nil))
-
-(_lux_def _meta
- (_lux_: (#Function (#Apply (#Apply Cursor Meta)
- Code')
- Code)
- (_lux_function _ data
- [dummy-cursor data]))
- #Nil)
-
(_lux_def return
(_lux_: (#UnivQ #Nil
(#Function (#Bound +1)
@@ -698,7 +795,7 @@
(_lux_function _ val
(_lux_function _ state
(#Right state val))))
- #Nil)
+ (record$ #Nil))
(_lux_def fail
(_lux_: (#UnivQ #Nil
@@ -710,68 +807,14 @@
(_lux_function _ msg
(_lux_function _ state
(#Left msg))))
- #Nil)
-
-(_lux_def bool$
- (_lux_: (#Function Bool Code)
- (_lux_function _ value (_meta (#Bool value))))
- #Nil)
-
-(_lux_def nat$
- (_lux_: (#Function Nat Code)
- (_lux_function _ value (_meta (#Nat value))))
- #Nil)
-
-(_lux_def int$
- (_lux_: (#Function Int Code)
- (_lux_function _ value (_meta (#Int value))))
- #Nil)
-
-(_lux_def deg$
- (_lux_: (#Function Deg Code)
- (_lux_function _ value (_meta (#Deg value))))
- #Nil)
-
-(_lux_def frac$
- (_lux_: (#Function Frac Code)
- (_lux_function _ value (_meta (#Frac value))))
- #Nil)
-
-(_lux_def text$
- (_lux_: (#Function Text Code)
- (_lux_function _ text (_meta (#Text text))))
- #Nil)
-
-(_lux_def symbol$
- (_lux_: (#Function Ident Code)
- (_lux_function _ ident (_meta (#Symbol ident))))
- #Nil)
-
-(_lux_def tag$
- (_lux_: (#Function Ident Code)
- (_lux_function _ ident (_meta (#Tag ident))))
- #Nil)
-
-(_lux_def form$
- (_lux_: (#Function (#Apply Code List) Code)
- (_lux_function _ tokens (_meta (#Form tokens))))
- #Nil)
-
-(_lux_def tuple$
- (_lux_: (#Function (#Apply Code List) Code)
- (_lux_function _ tokens (_meta (#Tuple tokens))))
- #Nil)
-
-(_lux_def record$
- (_lux_: (#Function (#Apply (#Product Code Code) List) Code)
- (_lux_function _ tokens (_meta (#Record tokens))))
- #Nil)
+ (record$ #Nil))
(_lux_def default-macro-meta
- (_lux_: Anns
- (#Cons [["lux" "macro?"] (#BoolA true)]
+ (_lux_: (#Apply (#Product Code Code) List)
+ (#Cons [(tag$ ["lux" "macro?"])
+ (bool$ true)]
#Nil))
- #Nil)
+ (record$ #Nil))
(_lux_def let''
(_lux_: Macro
@@ -784,7 +827,7 @@
_
(fail "Wrong syntax for let''"))))
- default-macro-meta)
+ (record$ default-macro-meta))
(_lux_def function''
(_lux_: Macro
@@ -822,34 +865,44 @@
_
(fail "Wrong syntax for function''"))))
- default-macro-meta)
+ (record$ default-macro-meta))
+
+(_lux_def cursor-code
+ (_lux_: Code
+ (tuple$ (#Cons (text$ "") (#Cons (nat$ +0) (#Cons (nat$ +0) #Nil)))))
+ (record$ #Nil))
+
+(_lux_def meta-code
+ (_lux_: (#Function Ident (#Function Code Code))
+ (_lux_function _ tag
+ (_lux_function _ value
+ (tuple$ (#Cons cursor-code
+ (#Cons (form$ (#Cons (tag$ tag) (#Cons value #Nil)))
+ #Nil))))))
+ (record$ #Nil))
+
+(_lux_def flag-meta
+ (_lux_: (#Function Text Code)
+ (_lux_function _ tag
+ (tuple$ (#Cons [(meta-code ["lux" "Tag"] (tuple$ (#Cons (text$ "lux") (#Cons (text$ tag) #Nil))))
+ (#Cons [(meta-code ["lux" "Bool"] (bool$ true))
+ #Nil])]))))
+ (record$ #Nil))
(_lux_def export?-meta
(_lux_: Code
- (tuple$ (#Cons [(tuple$ (#Cons [(text$ "lux") (#Cons [(text$ "export?") #Nil])]))
- (#Cons [(form$ (#Cons [(tag$ ["lux" "BoolA"])
- (#Cons [(bool$ true)
- #Nil])]))
- #Nil])])))
- #Nil)
+ (flag-meta "export?"))
+ (record$ #Nil))
(_lux_def hidden?-meta
(_lux_: Code
- (tuple$ (#Cons [(tuple$ (#Cons [(text$ "lux") (#Cons [(text$ "hidden?") #Nil])]))
- (#Cons [(form$ (#Cons [(tag$ ["lux" "BoolA"])
- (#Cons [(bool$ true)
- #Nil])]))
- #Nil])])))
- #Nil)
+ (flag-meta "hidden?"))
+ (record$ #Nil))
(_lux_def macro?-meta
(_lux_: Code
- (tuple$ (#Cons [(tuple$ (#Cons [(text$ "lux") (#Cons [(text$ "macro?") #Nil])]))
- (#Cons [(form$ (#Cons [(tag$ ["lux" "BoolA"])
- (#Cons [(bool$ true)
- #Nil])]))
- #Nil])])))
- #Nil)
+ (flag-meta "macro?"))
+ (record$ #Nil))
(_lux_def with-export-meta
(_lux_: (#Function Code Code)
@@ -857,7 +910,7 @@
(form$ (#Cons (tag$ ["lux" "Cons"])
(#Cons export?-meta
(#Cons tail #Nil))))))
- #Nil)
+ (record$ #Nil))
(_lux_def with-hidden-meta
(_lux_: (#Function Code Code)
@@ -865,7 +918,7 @@
(form$ (#Cons (tag$ ["lux" "Cons"])
(#Cons hidden?-meta
(#Cons tail #Nil))))))
- #Nil)
+ (record$ #Nil))
(_lux_def with-macro-meta
(_lux_: (#Function Code Code)
@@ -873,7 +926,7 @@
(form$ (#Cons (tag$ ["lux" "Cons"])
(#Cons macro?-meta
(#Cons tail #Nil))))))
- #Nil)
+ (record$ #Nil))
(_lux_def def:''
(_lux_: Macro
@@ -891,7 +944,10 @@
(#Cons [(_meta (#Tuple args))
(#Cons [body #Nil])])])])))
#Nil])])])))
- (#Cons (with-export-meta meta) #Nil)])])])))
+ (#Cons (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons (with-export-meta meta)
+ #Nil)))
+ #Nil)])])])))
#Nil]))
(#Cons [[_ (#Tag ["" "export"])] (#Cons [name (#Cons [meta (#Cons [type (#Cons [body #Nil])])])])])
@@ -901,7 +957,10 @@
(#Cons [type
(#Cons [body
#Nil])])])))
- (#Cons (with-export-meta meta) #Nil)])])])))
+ (#Cons (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons (with-export-meta meta)
+ #Nil)))
+ #Nil)])])])))
#Nil]))
(#Cons [[_ (#Form (#Cons [name args]))]
@@ -915,7 +974,10 @@
(#Cons [(_meta (#Tuple args))
(#Cons [body #Nil])])])])))
#Nil])])])))
- (#Cons meta #Nil)])])])))
+ (#Cons (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons meta
+ #Nil)))
+ #Nil)])])])))
#Nil]))
(#Cons [name (#Cons [meta (#Cons [type (#Cons [body #Nil])])])])
@@ -925,13 +987,16 @@
(#Cons [type
(#Cons [body
#Nil])])])))
- (#Cons meta #Nil)])])])))
+ (#Cons (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons meta
+ #Nil)))
+ #Nil)])])])))
#Nil]))
_
(fail "Wrong syntax for def''"))
))
- default-macro-meta)
+ (record$ default-macro-meta))
(def:'' (macro:' tokens)
default-macro-meta
@@ -973,9 +1038,10 @@
(fail "Wrong syntax for macro:'")))
(macro:' #export (comment tokens)
- (#Cons [["lux" "doc"] (#TextA "## Throws away any code given to it.
- ## Great for commenting-out code, while retaining syntax high-lighting and formatting in your text editor.
- (comment 1 2 3 4)")]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Throws away any code given to it.
+ ## Great for commenting-out code, while retaining syntax high-lighting and formatting in your text editor.
+ (comment 1 2 3 4)")]
#;Nil)
(return #Nil))
@@ -995,7 +1061,7 @@
(fail "Wrong syntax for $'")))
(def:'' (map f xs)
- #Nil
+ #;Nil
(#UnivQ #Nil
(#UnivQ #Nil
(#Function (#Function (#Bound +3) (#Bound +1))
@@ -1009,12 +1075,12 @@
(#Cons (f x) (map f xs'))))
(def:'' RepEnv
- #Nil
+ #;Nil
Type
($' List (#Product Text Code)))
(def:'' (make-env xs ys)
- #Nil
+ #;Nil
(#Function ($' List Text) (#Function ($' List Code) RepEnv))
(_lux_case [xs ys]
[(#Cons x xs') (#Cons y ys')]
@@ -1023,20 +1089,20 @@
_
#Nil))
-(def:'' (Text/= x y)
- #Nil
+(def:'' (text/= x y)
+ #;Nil
(#Function Text (#Function Text Bool))
(_lux_proc ["text" "="] [x y]))
(def:'' (get-rep key env)
- #Nil
+ #;Nil
(#Function Text (#Function RepEnv ($' Maybe Code)))
(_lux_case env
#Nil
#None
(#Cons [k v] env')
- (_lux_case (Text/= k key)
+ (_lux_case (text/= k key)
true
(#Some v)
@@ -1044,7 +1110,7 @@
(get-rep key env'))))
(def:'' (replace-syntax reps syntax)
- #Nil
+ #;Nil
(#Function RepEnv (#Function Code Code))
(_lux_case syntax
[_ (#Symbol "" name)]
@@ -1073,10 +1139,10 @@
syntax)
)
-(def:'' (update-bounds ast)
- #Nil
+(def:'' (update-bounds code)
+ #;Nil
(#Function Code Code)
- (_lux_case ast
+ (_lux_case code
[_ (#Tuple members)]
(tuple$ (map update-bounds members))
@@ -1094,10 +1160,10 @@
(form$ (map update-bounds members))
_
- ast))
+ code))
(def:'' (parse-quantified-args args next)
- #Nil
+ #;Nil
## (-> (List Code) (-> (List Text) (Lux (List Code))) (Lux (List Code)))
(#Function ($' List Code)
(#Function (#Function ($' List Text) (#Apply ($' List Code) Lux))
@@ -1115,12 +1181,12 @@
))
(def:'' (make-bound idx)
- #Nil
+ #;Nil
(#Function Nat Code)
(form$ (#Cons (tag$ ["lux" "Bound"]) (#Cons (nat$ idx) #Nil))))
(def:'' (fold f init xs)
- #Nil
+ #;Nil
## (All [a b] (-> (-> b a a) a (List b) a))
(#UnivQ #Nil (#UnivQ #Nil (#Function (#Function (#Bound +1)
(#Function (#Bound +3)
@@ -1136,20 +1202,21 @@
(fold f (f x init) xs')))
(def:'' (length list)
- #Nil
+ #;Nil
(#UnivQ #Nil
(#Function ($' List (#Bound +1)) Int))
(fold (function'' [_ acc] (_lux_proc ["int" "+"] [1 acc])) 0 list))
(macro:' #export (All tokens)
- (#Cons [["lux" "doc"] (#TextA "## Universal quantification.
- (All [a]
- (-> a a))
-
- ## A name can be provided, to specify a recursive type.
- (All List [a]
- (| Unit
- [a (List a)]))")]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Universal quantification.
+ (All [a]
+ (-> a a))
+
+ ## A name can be provided, to specify a recursive type.
+ (All List [a]
+ (| Unit
+ [a (List a)]))")]
#;Nil)
(let'' [self-name tokens] (_lux_case tokens
(#Cons [_ (#Symbol "" self-name)] tokens)
@@ -1169,7 +1236,7 @@
(update-bounds body')) #Nil))))))
body
names)
- (return (#Cons (_lux_case [(Text/= "" self-name) names]
+ (return (#Cons (_lux_case [(text/= "" self-name) names]
[true _]
body'
@@ -1191,16 +1258,17 @@
))
(macro:' #export (Ex tokens)
- (#Cons [["lux" "doc"] (#TextA "## Existential quantification.
- (Ex [a]
- [(Codec Text a)
- a])
-
- ## A name can be provided, to specify a recursive type.
- (Ex Self [a]
- [(Codec Text a)
- a
- (List (Self a))])")]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Existential quantification.
+ (Ex [a]
+ [(Codec Text a)
+ a])
+
+ ## A name can be provided, to specify a recursive type.
+ (Ex Self [a]
+ [(Codec Text a)
+ a
+ (List (Self a))])")]
#;Nil)
(let'' [self-name tokens] (_lux_case tokens
(#Cons [_ (#Symbol "" self-name)] tokens)
@@ -1220,7 +1288,7 @@
(update-bounds body')) #Nil))))))
body
names)
- (return (#Cons (_lux_case [(Text/= "" self-name) names]
+ (return (#Cons (_lux_case [(text/= "" self-name) names]
[true _]
body'
@@ -1242,17 +1310,18 @@
))
(def:'' (reverse list)
- #Nil
+ #;Nil
(All [a] (#Function ($' List a) ($' List a)))
(fold (function'' [head tail] (#Cons head tail))
#Nil
list))
(macro:' #export (-> tokens)
- (#Cons [["lux" "doc"] (#TextA "## Function types:
- (-> Int Int Int)
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Function types:
+ (-> Int Int Int)
- ## This is the type of a function that takes 2 Ints and returns an Int.")]
+ ## This is the type of a function that takes 2 Ints and returns an Int.")]
#;Nil)
(_lux_case (reverse tokens)
(#Cons output inputs)
@@ -1266,8 +1335,9 @@
(fail "Wrong syntax for ->")))
(macro:' #export (list xs)
- (#Cons [["lux" "doc"] (#TextA "## List-construction macro.
- (list 1 2 3)")]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## List-construction macro.
+ (list 1 2 3)")]
#;Nil)
(return (#Cons (fold (function'' [head tail]
(form$ (#Cons (tag$ ["lux" "Cons"])
@@ -1278,9 +1348,10 @@
#Nil)))
(macro:' #export (list& xs)
- (#Cons [["lux" "doc"] (#TextA "## List-construction macro, with the last element being a tail-list.
- ## In other words, this macro prepends elements to another list.
- (list& 1 2 3 (list 4 5 6))")]
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## List-construction macro, with the last element being a tail-list.
+ ## In other words, this macro prepends elements to another list.
+ (list& 1 2 3 (list 4 5 6))")]
#;Nil)
(_lux_case (reverse xs)
(#Cons last init)
@@ -1294,11 +1365,12 @@
(fail "Wrong syntax for list&")))
(macro:' #export (& tokens)
- (#Cons [["lux" "doc"] (#TextA "## Tuple types:
- (& Text Int Bool)
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Tuple types:
+ (& Text Int Bool)
- ## The empty tuple, a.k.a. Unit.
- (&)")]
+ ## The empty tuple, a.k.a. Unit.
+ (&)")]
#;Nil)
(_lux_case (reverse tokens)
#Nil
@@ -1311,11 +1383,12 @@
))
(macro:' #export (| tokens)
- (#Cons [["lux" "doc"] (#TextA "## Variant types:
- (| Text Int Bool)
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Variant types:
+ (| Text Int Bool)
- ## The empty tuple, a.k.a. Void.
- (|)")]
+ ## The empty tuple, a.k.a. Void.
+ (|)")]
#;Nil)
(_lux_case (reverse tokens)
#Nil
@@ -1368,7 +1441,9 @@
name
(tuple$ args)
body))))
- (with-export-meta meta)))))
+ (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons (with-export-meta meta)
+ #Nil)))))))
(#Cons [[_ (#Tag ["" "export"])] (#Cons [name (#Cons [meta (#Cons [type (#Cons [body #Nil])])])])])
(return (list (form$ (list (symbol$ ["" "_lux_def"])
@@ -1376,7 +1451,9 @@
(form$ (list (symbol$ ["" "_lux_:"])
type
body))
- (with-export-meta meta)))))
+ (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons (with-export-meta meta)
+ #Nil)))))))
(#Cons [[_ (#Form (#Cons [name args]))]
(#Cons [meta (#Cons [type (#Cons [body #Nil])])])])
@@ -1388,20 +1465,24 @@
name
(tuple$ args)
body))))
- meta))))
+ (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons meta
+ #Nil)))))))
(#Cons [name (#Cons [meta (#Cons [type (#Cons [body #Nil])])])])
(return (list (form$ (list (symbol$ ["" "_lux_def"])
name
(form$ (list (symbol$ ["" "_lux_:"]) type body))
- meta))))
+ (form$ (#Cons (symbol$ ["lux" "record$"])
+ (#Cons meta
+ #Nil)))))))
_
(fail "Wrong syntax for def'''")
))
(def:''' (as-pairs xs)
- #Nil
+ #;Nil
(All [a] (-> ($' List a) ($' List (& a a))))
(_lux_case xs
(#Cons x (#Cons y xs'))
@@ -1426,7 +1507,7 @@
(fail "Wrong syntax for let'")))
(def:''' (any? p xs)
- #Nil
+ #;Nil
(All [a]
(-> (-> a Bool) ($' List a) Bool))
(_lux_case xs
@@ -1439,7 +1520,7 @@
false (any? p xs'))))
(def:''' (spliced? token)
- #Nil
+ #;Nil
(-> Code Bool)
(_lux_case token
[_ (#Form (#Cons [[_ (#Symbol ["" "~@"])] (#Cons [_ #Nil])]))]
@@ -1449,13 +1530,13 @@
false))
(def:''' (wrap-meta content)
- #Nil
+ #;Nil
(-> Code Code)
(tuple$ (list (tuple$ (list (text$ "") (nat$ +0) (nat$ +0)))
content)))
(def:''' (untemplate-list tokens)
- #Nil
+ #;Nil
(-> ($' List Code) Code)
(_lux_case tokens
#Nil
@@ -1464,18 +1545,19 @@
(#Cons [token tokens'])
(_meta (#Form (list (_meta (#Tag ["lux" "Cons"])) token (untemplate-list tokens'))))))
-(def:''' (List/compose xs ys)
- #Nil
+(def:''' (list/compose xs ys)
+ #;Nil
(All [a] (-> ($' List a) ($' List a) ($' List a)))
(_lux_case xs
(#Cons x xs')
- (#Cons x (List/compose xs' ys))
+ (#Cons x (list/compose xs' ys))
#Nil
ys))
(def:''' #export (splice-helper xs ys)
- (#Cons [["lux" "hidden?"] (#BoolA true)]
+ (#Cons [(tag$ ["lux" "hidden?"])
+ (bool$ true)]
#;Nil)
(-> ($' List Code) ($' List Code) ($' List Code))
(_lux_case xs
@@ -1490,17 +1572,18 @@
(-> Code Code Code Code)
(_lux_case op
[_ (#Form parts)]
- (form$ (List/compose parts (list a1 a2)))
+ (form$ (list/compose parts (list a1 a2)))
_
(form$ (list op a1 a2))))
(macro:' #export (_$ tokens)
- (#Cons [["lux" "doc"] (#TextA "## Left-association for the application of binary functions over variadic arguments.
- (_$ Text/compose \"Hello, \" name \".\\nHow are you?\")
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Left-association for the application of binary functions over variadic arguments.
+ (_$ text/compose \"Hello, \" name \".\\nHow are you?\")
- ## =>
- (Text/compose (Text/compose \"Hello, \" name) \".\\nHow are you?\")")]
+ ## =>
+ (text/compose (text/compose \"Hello, \" name) \".\\nHow are you?\")")]
#;Nil)
(_lux_case tokens
(#Cons op tokens')
@@ -1515,11 +1598,12 @@
(fail "Wrong syntax for _$")))
(macro:' #export ($_ tokens)
- (#Cons [["lux" "doc"] (#TextA "## Right-association for the application of binary functions over variadic arguments.
- ($_ Text/compose \"Hello, \" name \".\\nHow are you?\")
+ (#Cons [(tag$ ["lux" "doc"])
+ (text$ "## Right-association for the application of binary functions over variadic arguments.
+ ($_ text/compose \"Hello, \" name \".\\nHow are you?\")
- ## =>
- (Text/compose \"Hello, \" (Text/compose name \".\\nHow are you?\"))")]
+ ## =>
+ (text/compose \"Hello, \" (text/compose name \".\\nHow are you?\"))")]
#;Nil)
(_lux_case tokens
(#Cons op tokens')
@@ -1539,7 +1623,8 @@
## (: (All [a b] (-> (-> a (m b)) (m a) (m b)))
## bind))
(def:''' Monad
- (list& [["lux" "tags"] (#ListA (list (#TextA "wrap") (#TextA "bind")))]
+ (list& [(tag$ ["lux" "tags"])
+ (tuple$ (list (text$ "wrap") (text$ "bind")))]
default-def-meta-unexported)
Type
(#Named ["lux" "Monad"]
@@ -1627,13 +1712,14 @@
)))
(macro:' #export (if tokens)
- (list [["lux" "doc"] (#TextA "Picks which expression to evaluate based on a boolean test value.
+ (list [(tag$ ["lux" "doc"])
+ (text$ "Picks which expression to evaluate based on a boolean test value.
- (if true
- \"Oh, yeah!\"
- \"Aw hell naw!\")
+ (if true
+ \"Oh, yeah!\"
+ \"Aw hell naw!\")
- == \"Oh, yeah!\"")])
+ => \"Oh, yeah!\"")])
(_lux_case tokens
(#Cons test (#Cons then (#Cons else #Nil)))
(return (list (form$ (list (symbol$ ["" "_lux_case"]) test
@@ -1649,7 +1735,7 @@
(-> Text ($' List (& Text a)) ($' Maybe a)))
(_lux_case plist
(#Cons [[k' v] plist'])
- (if (Text/= k k')
+ (if (text/= k k')
(#Some v)
(get k plist'))
@@ -1665,45 +1751,56 @@
(list [k v])
(#Cons [[k' v'] dict'])
- (if (Text/= k k')
+ (if (text/= k k')
(#Cons [[k' v] dict'])
(#Cons [[k' v'] (put k v dict')]))))
(def:''' #export (log! message)
- (list [["lux" "doc"] (#TextA "Logs message to standard output.
+ (list [(tag$ ["lux" "doc"])
+ (text$ "Logs message to standard output.
- Useful for debugging.")])
+ Useful for debugging.")])
(-> Text Unit)
(_lux_proc ["io" "log"] [message]))
-(def:''' (Text/compose x y)
+(def:''' (text/compose x y)
#Nil
(-> Text Text Text)
(_lux_proc ["text" "append"] [x y]))
-(def:''' (Ident/encode ident)
+(def:''' (ident/encode ident)
#Nil
(-> Ident Text)
(let' [[module name] ident]
(_lux_case module
"" name
- _ ($_ Text/compose module ";" name))))
+ _ ($_ text/compose module ";" name))))
(def:''' (get-meta tag def-meta)
#Nil
- (-> Ident Anns ($' Maybe Ann-Value))
+ (-> Ident Code ($' Maybe Code))
(let' [[prefix name] tag]
(_lux_case def-meta
- (#Cons [[prefix' name'] value] def-meta')
- (_lux_case [(Text/= prefix prefix')
- (Text/= name name')]
- [true true]
- (#Some value)
+ [_ (#Record def-meta)]
+ (_lux_case def-meta
+ (#Cons [key value] def-meta')
+ (_lux_case key
+ [_ (#Tag [prefix' name'])]
+ (_lux_case [(text/= prefix prefix')
+ (text/= name name')]
+ [true true]
+ (#Some value)
- _
- (get-meta tag def-meta'))
+ _
+ (get-meta tag (record$ def-meta')))
- #Nil
+ _
+ (get-meta tag (record$ def-meta')))
+
+ #Nil
+ #None)
+
+ _
#None)))
(def:''' (resolve-global-symbol ident state)
@@ -1715,21 +1812,21 @@
#seed seed #expected expected #cursor cursor
#scope-type-vars scope-type-vars} state]
(_lux_case (get module modules)
- (#Some {#module-hash _ #module-aliases _ #defs defs #imports _ #tags tags #types types #module-anns _ #module-state _})
+ (#Some {#module-hash _ #module-aliases _ #defs defs #imports _ #tags tags #types types #module-annotations _ #module-state _})
(_lux_case (get name defs)
(#Some [def-type def-meta def-value])
(_lux_case (get-meta ["lux" "alias"] def-meta)
- (#Some (#IdentA real-name))
+ (#Some [_ (#Symbol real-name)])
(#Right [state real-name])
_
(#Right [state ident]))
#None
- (#Left ($_ Text/compose "Unknown definition: " (Ident/encode ident))))
+ (#Left ($_ text/compose "Unknown definition: " (ident/encode ident))))
#None
- (#Left ($_ Text/compose "Unknown module: " module " @ " (Ident/encode ident))))))
+ (#Left ($_ text/compose "Unknown module: " module " @ " (ident/encode ident))))))
(def:''' (splice replace? untemplate tag elems)
#Nil
@@ -1806,7 +1903,7 @@
(do Monad<Lux>
[real-name (_lux_case module
""
- (if (Text/= "" subst)
+ (if (text/= "" subst)
(wrap [module name])
(resolve-global-symbol [subst name]))
@@ -1848,10 +1945,11 @@
))
(macro:' #export (host tokens)
- (list [["lux" "doc"] (#TextA "## Macro to treat host-types as Lux-types.
- (host java.lang.Object)
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Macro to treat host-types as Lux-types.
+ (host java.lang.Object)
- (host java.util.List [java.lang.Long])")])
+ (host java.util.List [java.lang.Long])")])
(_lux_case tokens
(#Cons [_ (#Symbol "" class-name)] #Nil)
(return (list (form$ (list (tag$ ["lux" "Host"]) (text$ class-name) (tag$ ["lux" "Nil"])))))
@@ -1879,11 +1977,12 @@
)))
(macro:' #export (` tokens)
- (list [["lux" "doc"] (#TextA "## Hygienic quasi-quotation as a macro. Unquote (~) and unquote-splice (~@) must also be used as forms.
- ## All unprefixed macros will receive their parent module's prefix if imported; otherwise will receive the prefix of the module on which the quasi-quote is being used.
- (` (def: (~ name)
- (function [(~@ args)]
- (~ body))))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Hygienic quasi-quotation as a macro. Unquote (~) and unquote-splice (~@) must also be used as forms.
+ ## All unprefixed macros will receive their parent module's prefix if imported; otherwise will receive the prefix of the module on which the quasi-quote is being used.
+ (` (def: (~ name)
+ (function [(~@ args)]
+ (~ body))))")])
(_lux_case tokens
(#Cons template #Nil)
(do Monad<Lux>
@@ -1895,10 +1994,11 @@
(fail "Wrong syntax for `")))
(macro:' #export (`' tokens)
- (list [["lux" "doc"] (#TextA "## Unhygienic quasi-quotation as a macro. Unquote (~) and unquote-splice (~@) must also be used as forms.
- (`' (def: (~ name)
- (function [(~@ args)]
- (~ body))))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Unhygienic quasi-quotation as a macro. Unquote (~) and unquote-splice (~@) must also be used as forms.
+ (`' (def: (~ name)
+ (function [(~@ args)]
+ (~ body))))")])
(_lux_case tokens
(#Cons template #Nil)
(do Monad<Lux>
@@ -1909,8 +2009,9 @@
(fail "Wrong syntax for `")))
(macro:' #export (' tokens)
- (list [["lux" "doc"] (#TextA "## Quotation as a macro.
- (' \"YOLO\")")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Quotation as a macro.
+ (' \"YOLO\")")])
(_lux_case tokens
(#Cons template #Nil)
(do Monad<Lux>
@@ -1921,23 +2022,24 @@
(fail "Wrong syntax for '")))
(macro:' #export (|> tokens)
- (list [["lux" "doc"] (#TextA "## Piping macro.
- (|> elems (map Int/encode) (interpose \" \") (fold Text/compose \"\"))
-
- ## =>
- (fold Text/compose \"\"
- (interpose \" \"
- (map Int/encode elems)))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Piping macro.
+ (|> elems (map int/encode) (interpose \" \") (fold text/compose \"\"))
+
+ ## =>
+ (fold text/compose \"\"
+ (interpose \" \"
+ (map int/encode elems)))")])
(_lux_case tokens
(#Cons [init apps])
(return (list (fold (_lux_: (-> Code Code Code)
(function' [app acc]
(_lux_case app
[_ (#Tuple parts)]
- (tuple$ (List/compose parts (list acc)))
+ (tuple$ (list/compose parts (list acc)))
[_ (#Form parts)]
- (form$ (List/compose parts (list acc)))
+ (form$ (list/compose parts (list acc)))
_
(` ((~ app) (~ acc))))))
@@ -1948,23 +2050,24 @@
(fail "Wrong syntax for |>")))
(macro:' #export (<| tokens)
- (list [["lux" "doc"] (#TextA "## Reverse piping macro.
- (<| (fold Text/compose \"\") (interpose \" \") (map Int/encode) elems)
-
- ## =>
- (fold Text/compose \"\"
- (interpose \" \"
- (map Int/encode elems)))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Reverse piping macro.
+ (<| (fold text/compose \"\") (interpose \" \") (map int/encode) elems)
+
+ ## =>
+ (fold text/compose \"\"
+ (interpose \" \"
+ (map int/encode elems)))")])
(_lux_case (reverse tokens)
(#Cons [init apps])
(return (list (fold (_lux_: (-> Code Code Code)
(function' [app acc]
(_lux_case app
[_ (#Tuple parts)]
- (tuple$ (List/compose parts (list acc)))
+ (tuple$ (list/compose parts (list acc)))
[_ (#Form parts)]
- (form$ (List/compose parts (list acc)))
+ (form$ (list/compose parts (list acc)))
_
(` ((~ app) (~ acc))))))
@@ -1975,7 +2078,8 @@
(fail "Wrong syntax for <|")))
(def:''' #export (. f g)
- (list [["lux" "doc"] (#TextA "Function composition.")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "Function composition.")])
(All [a b c]
(-> (-> b c) (-> a b) (-> a c)))
(function' [x] (f (g x))))
@@ -2057,7 +2161,7 @@
#Nil
(#Cons [x xs'])
- (List/compose (f x) (join-map f xs'))))
+ (list/compose (f x) (join-map f xs'))))
(def:''' (every? p xs)
#Nil
@@ -2066,14 +2170,15 @@
(fold (function' [_2 _1] (if _1 (p _2) false)) true xs))
(macro:' #export (do-template tokens)
- (list [["lux" "doc"] (#TextA "## By specifying a pattern (with holes), and the input data to fill those holes, repeats the pattern as many times as necessary.
- (do-template [<name> <diff>]
- [(def: #export <name>
- (-> Int Int)
- (i.+ <diff>))]
-
- [i.inc 1]
- [i.dec -1])")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## By specifying a pattern (with holes), and the input data to fill those holes, repeats the pattern as many times as necessary.
+ (do-template [<name> <diff>]
+ [(def: #export <name>
+ (-> Int Int)
+ (i.+ <diff>))]
+
+ [i.inc 1]
+ [i.dec -1])")])
(_lux_case tokens
(#Cons [[_ (#Tuple bindings)] (#Cons [[_ (#Tuple templates)] data])])
(_lux_case [(mapM Monad<Maybe> get-name bindings)
@@ -2098,29 +2203,29 @@
(do-template [<type> <category> <=-name> <lt-name> <lte-name> <gt-name> <gte-name>
<eq-doc> <<-doc> <<=-doc> <>-doc> <>=-doc>]
[(def:''' #export (<=-name> test subject)
- (list [["lux" "doc"] (#TextA <eq-doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <eq-doc>)])
(-> <type> <type> Bool)
(_lux_proc [<category> "="] [subject test]))
(def:''' #export (<lt-name> test subject)
- (list [["lux" "doc"] (#TextA <<-doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <<-doc>)])
(-> <type> <type> Bool)
(_lux_proc [<category> "<"] [subject test]))
(def:''' #export (<lte-name> test subject)
- (list [["lux" "doc"] (#TextA <<=-doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <<=-doc>)])
(-> <type> <type> Bool)
(if (_lux_proc [<category> "<"] [subject test])
true
(_lux_proc [<category> "="] [subject test])))
(def:''' #export (<gt-name> test subject)
- (list [["lux" "doc"] (#TextA <>-doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <>-doc>)])
(-> <type> <type> Bool)
(_lux_proc [<category> "<"] [test subject]))
(def:''' #export (<gte-name> test subject)
- (list [["lux" "doc"] (#TextA <>=-doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <>=-doc>)])
(-> <type> <type> Bool)
(if (_lux_proc [<category> "<"] [test subject])
true
@@ -2141,7 +2246,7 @@
(do-template [<type> <name> <op> <doc>]
[(def:''' #export (<name> param subject)
- (list [["lux" "doc"] (#TextA <doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <doc>)])
(-> <type> <type> <type>)
(_lux_proc <op> [subject param]))]
@@ -2172,7 +2277,7 @@
(do-template [<type> <name> <op> <doc>]
[(def:''' #export (<name> param subject)
- (list [["lux" "doc"] (#TextA <doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <doc>)])
(-> Nat <type> <type>)
(_lux_proc <op> [subject param]))]
@@ -2182,7 +2287,7 @@
(do-template [<name> <type> <test> <doc>]
[(def:''' #export (<name> left right)
- (list [["lux" "doc"] (#TextA <doc>)])
+ (list [(tag$ ["lux" "doc"]) (text$ <doc>)])
(-> <type> <type> <type>)
(if (<test> right left)
left
@@ -2201,7 +2306,7 @@
[f.max Frac f.> "Frac minimum."]
)
-(def:''' (Bool/encode x)
+(def:''' (bool/encode x)
#Nil
(-> Bool Text)
(if x "true" "false"))
@@ -2216,7 +2321,7 @@
+7 "7" +8 "8" +9 "9"
_ (_lux_proc ["io" "error"] ["undefined"])))
-(def:''' (Nat/encode value)
+(def:''' (nat/encode value)
#Nil
(-> Nat Text)
(_lux_case value
@@ -2233,14 +2338,14 @@
output])))))]
(loop value ""))))
-(def:''' (Int/abs value)
+(def:''' (int/abs value)
#Nil
(-> Int Int)
(if (i.< 0 value)
(i.* -1 value)
value))
-(def:''' (Int/encode value)
+(def:''' (int/encode value)
#Nil
(-> Int Text)
(if (i.= 0 value)
@@ -2255,10 +2360,10 @@
(recur (i./ 10 input)
(_lux_proc ["text" "append"] [(|> input (i.% 10) (_lux_:! Nat) digit-to-text)
output])))))
- (|> value (i./ 10) Int/abs)
- (|> value (i.% 10) Int/abs (_lux_:! Nat) digit-to-text)))))
+ (|> value (i./ 10) int/abs)
+ (|> value (i.% 10) int/abs (_lux_:! Nat) digit-to-text)))))
-(def:''' (Frac/encode x)
+(def:''' (frac/encode x)
#Nil
(-> Frac Text)
(_lux_proc ["frac" "encode"] [x]))
@@ -2269,11 +2374,12 @@
(i.= 0 (i.% div n)))
(def:''' #export (not x)
- (list [["lux" "doc"] (#TextA "## Boolean negation.
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Boolean negation.
- (not true) == false
+ (not true) => false
- (not false) == true")])
+ (not false) => true")])
(-> Bool Bool)
(if x false true))
@@ -2284,23 +2390,23 @@
($' Maybe Macro))
(do Monad<Maybe>
[$module (get module modules)
- gdef (let' [{#module-hash _ #module-aliases _ #defs bindings #imports _ #tags tags #types types #module-anns _ #module-state _} (_lux_: Module $module)]
+ gdef (let' [{#module-hash _ #module-aliases _ #defs bindings #imports _ #tags tags #types types #module-annotations _ #module-state _} (_lux_: Module $module)]
(get name bindings))]
(let' [[def-type def-meta def-value] (_lux_: Def gdef)]
(_lux_case (get-meta ["lux" "macro?"] def-meta)
- (#Some (#BoolA true))
+ (#Some [_ (#Bool true)])
(_lux_case (get-meta ["lux" "export?"] def-meta)
- (#Some (#BoolA true))
+ (#Some [_ (#Bool true)])
(#Some (_lux_:! Macro def-value))
_
- (if (Text/= module current-module)
+ (if (text/= module current-module)
(#Some (_lux_:! Macro def-value))
#None))
_
(_lux_case (get-meta ["lux" "alias"] def-meta)
- (#Some (#IdentA [r-module r-name]))
+ (#Some [_ (#Symbol [r-module r-name])])
(find-macro' modules current-module r-module r-name)
_
@@ -2345,11 +2451,11 @@
(#Some _) true
#None false))))
-(def:''' (List/join xs)
+(def:''' (list/join xs)
#Nil
(All [a]
(-> ($' List ($' List a)) ($' List a)))
- (fold List/compose #Nil (reverse xs)))
+ (fold list/compose #Nil (reverse xs)))
(def:''' (interpose sep xs)
#Nil
@@ -2396,7 +2502,7 @@
(do Monad<Lux>
[expansion (macro args)
expansion' (mapM Monad<Lux> macro-expand expansion)]
- (wrap (List/join expansion')))
+ (wrap (list/join expansion')))
#None
(return (list token))))
@@ -2417,22 +2523,22 @@
(do Monad<Lux>
[expansion (macro args)
expansion' (mapM Monad<Lux> macro-expand-all expansion)]
- (wrap (List/join expansion')))
+ (wrap (list/join expansion')))
#None
(do Monad<Lux>
[args' (mapM Monad<Lux> macro-expand-all args)]
- (wrap (list (form$ (#Cons (symbol$ macro-name) (List/join args'))))))))
+ (wrap (list (form$ (#Cons (symbol$ macro-name) (list/join args'))))))))
[_ (#Form members)]
(do Monad<Lux>
[members' (mapM Monad<Lux> macro-expand-all members)]
- (wrap (list (form$ (List/join members')))))
+ (wrap (list (form$ (list/join members')))))
[_ (#Tuple members)]
(do Monad<Lux>
[members' (mapM Monad<Lux> macro-expand-all members)]
- (wrap (list (tuple$ (List/join members')))))
+ (wrap (list (tuple$ (list/join members')))))
[_ (#Record pairs)]
(do Monad<Lux>
@@ -2473,8 +2579,9 @@
type))
(macro:' #export (type tokens)
- (list [["lux" "doc"] (#TextA "## Takes a type expression and returns it's representation as data-structure.
- (type (All [a] (Maybe (List a))))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Takes a type expression and returns it's representation as data-structure.
+ (type (All [a] (Maybe (List a))))")])
(_lux_case tokens
(#Cons type #Nil)
(do Monad<Lux>
@@ -2490,8 +2597,9 @@
(fail "Wrong syntax for type")))
(macro:' #export (: tokens)
- (list [["lux" "doc"] (#TextA "## The type-annotation macro.
- (: (List Int) (list 1 2 3))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## The type-annotation macro.
+ (: (List Int) (list 1 2 3))")])
(_lux_case tokens
(#Cons type (#Cons value #Nil))
(return (list (` (;_lux_: (type (~ type)) (~ value)))))
@@ -2500,8 +2608,9 @@
(fail "Wrong syntax for :")))
(macro:' #export (:! tokens)
- (list [["lux" "doc"] (#TextA "## The type-coercion macro.
- (:! Dinosaur (list 1 2 3))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## The type-coercion macro.
+ (:! Dinosaur (list 1 2 3))")])
(_lux_case tokens
(#Cons type (#Cons value #Nil))
(return (list (` (;_lux_:! (type (~ type)) (~ value)))))
@@ -2525,10 +2634,10 @@
[first a x]
[second b y])
-(def:''' (unfold-type-def type-asts)
+(def:''' (unfold-type-def type-codes)
#Nil
(-> ($' List Code) ($' Lux (& Code ($' Maybe ($' List Text)))))
- (_lux_case type-asts
+ (_lux_case type-codes
(#Cons [_ (#Record pairs)] #;Nil)
(do Monad<Lux>
[members (mapM Monad<Lux>
@@ -2593,13 +2702,14 @@
#seed (n.+ +1 seed) #expected expected
#cursor cursor
#scope-type-vars scope-type-vars}
- (symbol$ ["" ($_ Text/compose "__gensym__" prefix (Nat/encode seed))]))))
+ (symbol$ ["" ($_ text/compose "__gensym__" prefix (nat/encode seed))]))))
(macro:' #export (Rec tokens)
- (list [["lux" "doc"] (#TextA "## Parameter-less recursive types.
- ## A name has to be given to the whole type, to use it within its body.
- (Rec Self
- [Int (List Self)])")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Parameter-less recursive types.
+ ## A name has to be given to the whole type, to use it within its body.
+ (Rec Self
+ [Int (List Self)])")])
(_lux_case tokens
(#Cons [_ (#Symbol "" name)] (#Cons body #Nil))
(let' [body' (replace-syntax (list [name (` (#Apply (~ (make-bound +1)) (~ (make-bound +0))))])
@@ -2610,12 +2720,13 @@
(fail "Wrong syntax for Rec")))
(macro:' #export (exec tokens)
- (list [["lux" "doc"] (#TextA "## Sequential execution of expressions (great for side-effects).
- (exec
- (log! \"#1\")
- (log! \"#2\")
- (log! \"#3\")
- \"YOLO\")")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Sequential execution of expressions (great for side-effects).
+ (exec
+ (log! \"#1\")
+ (log! \"#2\")
+ (log! \"#3\")
+ \"YOLO\")")])
(_lux_case (reverse tokens)
(#Cons value actions)
(let' [dummy (symbol$ ["" ""])]
@@ -2629,7 +2740,7 @@
(macro:' (def:' tokens)
(let' [[export? tokens'] (_lux_case tokens
- (#Cons [_ (#Tag "" "export")] tokens')
+ (#Cons [_ (#Tag ["" "export"])] tokens')
[true tokens']
_
@@ -2665,9 +2776,10 @@
#None
body')]
(return (list (` (;_lux_def (~ name) (~ body'')
- (~ (if export?
- (with-export-meta (tag$ ["lux" "Nil"]))
- (tag$ ["lux" "Nil"]))))))))
+ [(~ cursor-code)
+ (#;Record (~ (if export?
+ (with-export-meta (tag$ ["lux" "Nil"]))
+ (tag$ ["lux" "Nil"]))))])))))
#None
(fail "Wrong syntax for def'"))))
@@ -2677,57 +2789,57 @@
(let' [[left right] pair]
(list left right)))
-(def:' (ast-to-text ast)
+(def:' (code-to-text code)
(-> Code Text)
- (_lux_case ast
+ (_lux_case code
[_ (#Bool value)]
- (Bool/encode value)
+ (bool/encode value)
[_ (#Nat value)]
- (Nat/encode value)
+ (nat/encode value)
[_ (#Int value)]
- (Int/encode value)
+ (int/encode value)
[_ (#Deg value)]
(_lux_proc ["io" "error"] ["Undefined behavior."])
[_ (#Frac value)]
- (Frac/encode value)
+ (frac/encode value)
[_ (#Text value)]
- ($_ Text/compose "\"" value "\"")
+ ($_ text/compose "\"" value "\"")
[_ (#Symbol [prefix name])]
- (if (Text/= "" prefix)
+ (if (text/= "" prefix)
name
- ($_ Text/compose prefix ";" name))
+ ($_ text/compose prefix ";" name))
[_ (#Tag [prefix name])]
- (if (Text/= "" prefix)
- ($_ Text/compose "#" name)
- ($_ Text/compose "#" prefix ";" name))
+ (if (text/= "" prefix)
+ ($_ text/compose "#" name)
+ ($_ text/compose "#" prefix ";" name))
[_ (#Form xs)]
- ($_ Text/compose "(" (|> xs
- (map ast-to-text)
+ ($_ text/compose "(" (|> xs
+ (map code-to-text)
(interpose " ")
reverse
- (fold Text/compose "")) ")")
+ (fold text/compose "")) ")")
[_ (#Tuple xs)]
- ($_ Text/compose "[" (|> xs
- (map ast-to-text)
+ ($_ text/compose "[" (|> xs
+ (map code-to-text)
(interpose " ")
reverse
- (fold Text/compose "")) "]")
+ (fold text/compose "")) "]")
[_ (#Record kvs)]
- ($_ Text/compose "{" (|> kvs
- (map (function' [kv] (_lux_case kv [k v] ($_ Text/compose (ast-to-text k) " " (ast-to-text v)))))
+ ($_ text/compose "{" (|> kvs
+ (map (function' [kv] (_lux_case kv [k v] ($_ text/compose (code-to-text k) " " (code-to-text v)))))
(interpose " ")
reverse
- (fold Text/compose "")) "}")
+ (fold text/compose "")) "}")
))
(def:' (expander branches)
@@ -2757,21 +2869,22 @@
(do Monad<Lux> [] (wrap (list)))
_
- (fail ($_ Text/compose "\"lux;case\" expects an even number of tokens: " (|> branches
- (map ast-to-text)
+ (fail ($_ text/compose "\"lux;case\" expects an even number of tokens: " (|> branches
+ (map code-to-text)
(interpose " ")
reverse
- (fold Text/compose ""))))))
+ (fold text/compose ""))))))
(macro:' #export (case tokens)
- (list [["lux" "doc"] (#TextA "## The pattern-matching macro.
- ## Allows the usage of macros within the patterns to provide custom syntax.
- (case (: (List Int) (list 1 2 3))
- (#Cons x (#Cons y (#Cons z #Nil)))
- (#Some ($_ i.* x y z))
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## The pattern-matching macro.
+ ## Allows the usage of macros within the patterns to provide custom syntax.
+ (case (: (List Int) (list 1 2 3))
+ (#Cons x (#Cons y (#Cons z #Nil)))
+ (#Some ($_ i.* x y z))
- _
- #None)")])
+ _
+ #None)")])
(_lux_case tokens
(#Cons value branches)
(do Monad<Lux>
@@ -2782,14 +2895,15 @@
(fail "Wrong syntax for case")))
(macro:' #export (^ tokens)
- (list [["lux" "doc"] (#TextA "## Macro-expanding patterns.
- ## It's a special macro meant to be used with 'case'.
- (case (: (List Int) (list 1 2 3))
- (^ (list x y z))
- (#Some ($_ i.* x y z))
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Macro-expanding patterns.
+ ## It's a special macro meant to be used with 'case'.
+ (case (: (List Int) (list 1 2 3))
+ (^ (list x y z))
+ (#Some ($_ i.* x y z))
- _
- #None)")])
+ _
+ #None)")])
(case tokens
(#Cons [_ (#Form (#Cons pattern #Nil))] (#Cons body branches))
(do Monad<Lux>
@@ -2805,25 +2919,26 @@
(fail "Wrong syntax for ^ macro")))
(macro:' #export (^or tokens)
- (list [["lux" "doc"] (#TextA "## Or-patterns.
- ## It's a special macro meant to be used with 'case'.
- (type: Weekday
- #Monday
- #Tuesday
- #Wednesday
- #Thursday
- #Friday
- #Saturday
- #Sunday)
-
- (def: (weekend? day)
- (-> Weekday Bool)
- (case day
- (^or #Saturday #Sunday)
- true
-
- _
- false))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Or-patterns.
+ ## It's a special macro meant to be used with 'case'.
+ (type: Weekday
+ #Monday
+ #Tuesday
+ #Wednesday
+ #Thursday
+ #Friday
+ #Saturday
+ #Sunday)
+
+ (def: (weekend? day)
+ (-> Weekday Bool)
+ (case day
+ (^or #Saturday #Sunday)
+ true
+
+ _
+ false))")])
(case tokens
(^ (list& [_ (#Form patterns)] body branches))
(case patterns
@@ -2833,14 +2948,14 @@
_
(let' [pairs (|> patterns
(map (function' [pattern] (list pattern body)))
- (List/join))]
- (return (List/compose pairs branches))))
+ (list/join))]
+ (return (list/compose pairs branches))))
_
(fail "Wrong syntax for ^or")))
-(def:' (symbol? ast)
+(def:' (symbol? code)
(-> Code Bool)
- (case ast
+ (case code
[_ (#Symbol _)]
true
@@ -2848,11 +2963,12 @@
false))
(macro:' #export (let tokens)
- (list [["lux" "doc"] (#TextA "## Creates local bindings.
- ## Can (optionally) use pattern-matching macros when binding.
- (let [x (foo bar)
- y (baz quux)]
- (op x y))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Creates local bindings.
+ ## Can (optionally) use pattern-matching macros when binding.
+ (let [x (foo bar)
+ y (baz quux)]
+ (op x y))")])
(case tokens
(^ (list [_ (#Tuple bindings)] body))
(if (multiple? 2 (length bindings))
@@ -2872,13 +2988,14 @@
(fail "Wrong syntax for let")))
(macro:' #export (function tokens)
- (list [["lux" "doc"] (#TextA "## Syntax for creating functions.
- ## Allows for giving the function itself a name, for the sake of recursion.
- (: (All [a b] (-> a b a))
- (function [x y] x))
-
- (: (All [a b] (-> a b a))
- (function const [x y] x))")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Syntax for creating functions.
+ ## Allows for giving the function itself a name, for the sake of recursion.
+ (: (All [a b] (-> a b a))
+ (function [x y] x))
+
+ (: (All [a b] (-> a b a))
+ (function const [x y] x))")])
(case (: (Maybe [Ident Code (List Code) Code])
(case tokens
(^ (list [_ (#Tuple (#Cons head tail))] body))
@@ -2907,77 +3024,56 @@
#None
(fail "Wrong syntax for function")))
-(def:' (process-def-meta-value ast)
- (-> Code (Lux Code))
- (case ast
+(def:' (process-def-meta-value code)
+ (-> Code Code)
+ (case code
[_ (#Bool value)]
- (return (form$ (list (tag$ ["lux" "BoolA"]) (bool$ value))))
+ (meta-code ["lux" "Bool"] (bool$ value))
[_ (#Nat value)]
- (return (form$ (list (tag$ ["lux" "NatA"]) (nat$ value))))
+ (meta-code ["lux" "Nat"] (nat$ value))
[_ (#Int value)]
- (return (form$ (list (tag$ ["lux" "IntA"]) (int$ value))))
+ (meta-code ["lux" "Int"] (int$ value))
[_ (#Deg value)]
- (return (form$ (list (tag$ ["lux" "DegA"]) (deg$ value))))
+ (meta-code ["lux" "Deg"] (deg$ value))
[_ (#Frac value)]
- (return (form$ (list (tag$ ["lux" "FracA"]) (frac$ value))))
+ (meta-code ["lux" "Frac"] (frac$ value))
[_ (#Text value)]
- (return (form$ (list (tag$ ["lux" "TextA"]) (text$ value))))
+ (meta-code ["lux" "Text"] (text$ value))
[_ (#Tag [prefix name])]
- (return (form$ (list (tag$ ["lux" "IdentA"]) (tuple$ (list (text$ prefix) (text$ name))))))
+ (meta-code ["lux" "Tag"] (` [(~ (text$ prefix)) (~ (text$ name))]))
(^or [_ (#Form _)] [_ (#Symbol _)])
- (return ast)
+ code
[_ (#Tuple xs)]
- (do Monad<Lux>
- [=xs (mapM Monad<Lux> process-def-meta-value xs)]
- (wrap (form$ (list (tag$ ["lux" "ListA"]) (untemplate-list =xs)))))
+ (|> xs
+ (map process-def-meta-value)
+ untemplate-list
+ (meta-code ["lux" "Tuple"]))
[_ (#Record kvs)]
- (do Monad<Lux>
- [=xs (mapM Monad<Lux>
- (: (-> [Code Code] (Lux Code))
- (function [[k v]]
- (case k
- [_ (#Text =k)]
- (do Monad<Lux>
- [=v (process-def-meta-value v)]
- (wrap (tuple$ (list (text$ =k) =v))))
-
- _
- (fail (Text/compose "Wrong syntax for DictA key: " (ast-to-text k))))))
- kvs)]
- (wrap (form$ (list (tag$ ["lux" "DictA"]) (untemplate-list =xs)))))
+ (|> kvs
+ (map (: (-> [Code Code] Code)
+ (function [[k v]]
+ (` [(~ (process-def-meta-value k))
+ (~ (process-def-meta-value v))]))))
+ untemplate-list
+ (meta-code ["lux" "Record"]))
))
-(def:' (process-def-meta ast)
- (-> Code (Lux Code))
- (case ast
- [_ (#Record kvs)]
- (do Monad<Lux>
- [=kvs (mapM Monad<Lux>
- (: (-> [Code Code] (Lux Code))
- (function [[k v]]
- (case k
- [_ (#Tag [pk nk])]
- (do Monad<Lux>
- [=v (process-def-meta-value v)]
- (wrap (tuple$ (list (tuple$ (list (text$ pk) (text$ nk)))
- =v))))
-
- _
- (fail (Text/compose "Wrong syntax for Anns: " (ast-to-text ast))))))
- kvs)]
- (wrap (untemplate-list =kvs)))
-
- _
- (fail (Text/compose "Wrong syntax for Anns: " (ast-to-text ast)))))
+(def:' (process-def-meta kvs)
+ (-> (List [Code Code]) Code)
+ (untemplate-list (map (: (-> [Code Code] Code)
+ (function [[k v]]
+ (` [(~ (process-def-meta-value k))
+ (~ (process-def-meta-value v))])))
+ kvs)))
(def:' (with-func-args args meta)
(-> (List Code) Code Code)
@@ -2986,17 +3082,16 @@
meta
_
- (` (#;Cons [["lux" "func-args"]
- (#;ListA (list (~@ (map (function [arg]
- (` (#;TextA (~ (text$ (ast-to-text arg))))))
- args))))]
+ (` (#;Cons [[(~ cursor-code) (#;Tag ["lux" "func-args"])]
+ [(~ cursor-code) (#;Tuple (;list (~@ (map (function [arg]
+ (` [(~ cursor-code) (#;Text (~ (text$ (code-to-text arg))))]))
+ args))))]]
(~ meta)))))
(def:' (with-type-args args)
(-> (List Code) Code)
- (` {#;type-args (#;ListA (list (~@ (map (function [arg]
- (` (#;TextA (~ (text$ (ast-to-text arg))))))
- args))))}))
+ (` {#;type-args [(~@ (map (function [arg] (text$ (code-to-text arg)))
+ args))]}))
(def:' Export-Level
Type
@@ -3030,41 +3125,42 @@
(list (' #hidden))))
(macro:' #export (def: tokens)
- (list [["lux" "doc"] (#TextA "## Defines global constants/functions.
- (def: (rejoin-pair pair)
- (-> [Code Code] (List Code))
- (let [[left right] pair]
- (list left right)))
-
- (def: branching-exponent
- Int
- 5)")])
+ (list [(tag$ ["lux" "doc"])
+ (text$ "## Defines global constants/functions.
+ (def: (rejoin-pair pair)
+ (-> [Code Code] (List Code))
+ (let [[left right] pair]
+ (list left right)))
+
+ (def: branching-exponent
+ Int
+ 5)")])
(let [[export? tokens'] (export-level^ tokens)
- parts (: (Maybe [Code (List Code) (Maybe Code) Code Code])
+ parts (: (Maybe [Code (List Code) (Maybe Code) Code (List [Code Code])])
(case tokens'
- (^ (list [_ (#Form (#Cons name args))] meta type body))
- (#Some [name args (#Some type) body meta])
+ (^ (list [_ (#Form (#Cons name args))] [_ (#Record meta-kvs)] type body))
+ (#Some [name args (#Some type) body meta-kvs])
- (^ (list name meta type body))
- (#Some [name #Nil (#Some type) body meta])
+ (^ (list name [_ (#Record meta-kvs)] type body))
+ (#Some [name #Nil (#Some type) body meta-kvs])
(^ (list [_ (#Form (#Cons name args))] [_ (#Record meta-kvs)] body))
- (#Some [name args #None body (record$ meta-kvs)])
+ (#Some [name args #None body meta-kvs])
(^ (list name [_ (#Record meta-kvs)] body))
- (#Some [name #Nil #None body (record$ meta-kvs)])
+ (#Some [name #Nil #None body meta-kvs])
(^ (list [_ (#Form (#Cons name args))] type body))
- (#Some [name args (#Some type) body (' {})])
+ (#Some [name args (#Some type) body #Nil])
(^ (list name type body))
- (#Some [name #Nil (#Some type) body (' {})])
+ (#Some [name #Nil (#Some type) body #Nil])
(^ (list [_ (#Form (#Cons name args))] body))
- (#Some [name args #None body (' {})])
+ (#Some [name args #None body #Nil])
(^ (list name body))
- (#Some [name #Nil #None body (' {})])
+ (#Some [name #Nil #None body #Nil])
_
#None))]
@@ -3081,27 +3177,29 @@
(` (: (~ type) (~ body)))
#None
- body)]
- (do Monad<Lux>
- [=meta (process-def-meta meta)]
- (return (list (` (;_lux_def (~ name) (~ body) (~ (with-func-args args
- (case export?
- #;None
- =meta
-
- (#;Some (#;Left []))
- (with-export-meta =meta)
-
- (#;Some (#;Right []))
- (|> =meta
- with-export-meta
- with-hidden-meta)
- )))))))))
+ body)
+ =meta (process-def-meta meta)]
+ (return (list (` (;_lux_def (~ name)
+ (~ body)
+ [(~ cursor-code)
+ (#;Record (~ (with-func-args args
+ (case export?
+ #;None
+ =meta
+
+ (#;Some (#;Left []))
+ (with-export-meta =meta)
+
+ (#;Some (#;Right []))
+ (|> =meta
+ with-export-meta
+ with-hidden-meta)
+ ))))])))))
#None
(fail "Wrong syntax for def"))))
-(def: (meta-ast-add addition meta)
+(def: (meta-code-add addition meta)
(-> [Code Code] Code Code)
(case [addition meta]
[[name value] [cursor (#;Record pairs)]]
@@ -3110,27 +3208,28 @@
_
meta))
-(def: (meta-ast-merge addition base)
+(def: (meta-code-merge addition base)
(-> Code Code Code)
(case addition
[cursor (#;Record pairs)]
- (fold meta-ast-add base pairs)
+ (fold meta-code-add base pairs)
_
base))
(macro:' #export (macro: tokens)
- (list [["lux" "doc"] (#TextA "Macro-definition macro.
+ (list [(tag$ ["lux" "doc"])
+ (text$ "Macro-definition macro.
- (macro: #export (ident-for tokens)
- (case tokens
- (^template [<tag>]
- (^ (list [_ (<tag> [prefix name])]))
- (return (list (` [(~ (text$ prefix)) (~ (text$ name))]))))
- ([#;Symbol] [#;Tag])
+ (macro: #export (ident-for tokens)
+ (case tokens
+ (^template [<tag>]
+ (^ (list [_ (<tag> [prefix name])]))
+ (return (list (` [(~ (text$ prefix)) (~ (text$ name))]))))
+ ([#;Symbol] [#;Tag])
- _
- (fail \"Wrong syntax for ident-for\")))")])
+ _
+ (fail \"Wrong syntax for ident-for\")))")])
(let [[exported? tokens] (export-level^ tokens)
name+args+meta+body?? (: (Maybe [Ident (List Code) Code Code])
(case tokens
@@ -3156,8 +3255,8 @@
_ (` ((~ name) (~@ args))))]
(return (list (` (;;def: (~@ (export-level exported?))
(~ def-sig)
- (~ (meta-ast-merge (` {#;macro? true})
- meta))
+ (~ (meta-code-merge (` {#;macro? true})
+ meta))
;;Macro
(~ body))))))
@@ -3211,15 +3310,15 @@
_
(fail "Signatures require typed members!"))))
- (List/join sigs')))
+ (list/join sigs')))
#let [[_module _name] name+
def-name (symbol$ name)
sig-type (record$ (map (: (-> [Text Code] [Code Code])
(function [[m-name m-type]]
[(tag$ ["" m-name]) m-type]))
members))
- sig-meta (meta-ast-merge (` {#;sig? true})
- meta)
+ sig-meta (meta-code-merge (` {#;sig? true})
+ meta)
usage (case args
#;Nil
def-name
@@ -3466,7 +3565,7 @@
(#Right state module)
_
- (#Left ($_ Text/compose "Unknown module: " name))))))
+ (#Left ($_ text/compose "Unknown module: " name))))))
(def: get-current-module
(Lux Module)
@@ -3478,13 +3577,13 @@
(-> Ident (Lux [Nat (List Ident) Bool Type]))
(do Monad<Lux>
[=module (find-module module)
- #let [{#module-hash _ #module-aliases _ #defs bindings #imports _ #tags tags-table #types types #module-anns _ #module-state _} =module]]
+ #let [{#module-hash _ #module-aliases _ #defs bindings #imports _ #tags tags-table #types types #module-annotations _ #module-state _} =module]]
(case (get name tags-table)
(#Some output)
(return output)
_
- (fail (Text/compose "Unknown tag: " (Ident/encode [module name]))))))
+ (fail (text/compose "Unknown tag: " (ident/encode [module name]))))))
(def: (resolve-type-tags type)
(-> Type (Lux (Maybe [(List Ident) (List Type)])))
@@ -3501,7 +3600,7 @@
(#Named [module name] unnamed)
(do Monad<Lux>
[=module (find-module module)
- #let [{#module-hash _ #module-aliases _ #defs bindings #imports _ #tags tags #types types #module-anns _ #module-state _} =module]]
+ #let [{#module-hash _ #module-aliases _ #defs bindings #imports _ #tags tags #types types #module-annotations _ #module-state _} =module]]
(case (get name types)
(#Some [tags exported? (#Named _ _type)])
(case (resolve-struct-type _type)
@@ -3557,16 +3656,16 @@
(wrap [tag value])
_
- (fail (Text/compose "Unknown structure member: " tag-name)))
+ (fail (text/compose "Unknown structure member: " tag-name)))
_
(fail "Invalid structure member."))))
- (List/join tokens'))]
+ (list/join tokens'))]
(wrap (list (record$ members)))))
-(def: (Text/join parts)
+(def: (text/join parts)
(-> (List Text) Text)
- (|> parts reverse (fold Text/compose "")))
+ (|> parts reverse (fold text/compose "")))
(macro: #export (struct: tokens)
{#;doc "## Definition of structures ala ML.
@@ -3616,7 +3715,7 @@
#;None))
sig-args))
(^ (#;Some params))
- (#;Some (symbol$ ["" ($_ Text/compose sig-name "<" (|> params (interpose ",") Text/join) ">")]))
+ (#;Some (symbol$ ["" ($_ text/compose sig-name "<" (|> params (interpose ",") text/join) ">")]))
_
#;None)
@@ -3635,8 +3734,8 @@
_
(` ((~ name) (~@ args))))]
(return (list (` (;;def: (~@ (export-level exported?)) (~ usage)
- (~ (meta-ast-merge (` {#;struct? true})
- meta))
+ (~ (meta-code-merge (` {#;struct? true})
+ meta))
(~ type)
(struct (~@ defs)))))))
@@ -3686,38 +3785,34 @@
(^ (list [_ (#Symbol "" name)] [meta-cursor (#;Record meta-parts)] [type-cursor (#;Record type-parts)]))
(#Some [name #Nil [meta-cursor (#;Record meta-parts)] (list [type-cursor (#;Record type-parts)])])
- (^ (list& [_ (#Symbol "" name)] [meta-cursor (#;Record meta-parts)] type-ast1 type-asts))
- (#Some [name #Nil [meta-cursor (#;Record meta-parts)] (#;Cons type-ast1 type-asts)])
+ (^ (list& [_ (#Symbol "" name)] [meta-cursor (#;Record meta-parts)] type-code1 type-codes))
+ (#Some [name #Nil [meta-cursor (#;Record meta-parts)] (#;Cons type-code1 type-codes)])
- (^ (list& [_ (#Symbol "" name)] type-asts))
- (#Some [name #Nil (` {}) type-asts])
+ (^ (list& [_ (#Symbol "" name)] type-codes))
+ (#Some [name #Nil (` {}) type-codes])
(^ (list [_ (#Form (#Cons [_ (#Symbol "" name)] args))] [meta-cursor (#;Record meta-parts)] [type-cursor (#;Record type-parts)]))
(#Some [name args [meta-cursor (#;Record meta-parts)] (list [type-cursor (#;Record type-parts)])])
- (^ (list& [_ (#Form (#Cons [_ (#Symbol "" name)] args))] [meta-cursor (#;Record meta-parts)] type-ast1 type-asts))
- (#Some [name args [meta-cursor (#;Record meta-parts)] (#;Cons type-ast1 type-asts)])
+ (^ (list& [_ (#Form (#Cons [_ (#Symbol "" name)] args))] [meta-cursor (#;Record meta-parts)] type-code1 type-codes))
+ (#Some [name args [meta-cursor (#;Record meta-parts)] (#;Cons type-code1 type-codes)])
- (^ (list& [_ (#Form (#Cons [_ (#Symbol "" name)] args))] type-asts))
- (#Some [name args (` {}) type-asts])
+ (^ (list& [_ (#Form (#Cons [_ (#Symbol "" name)] args))] type-codes))
+ (#Some [name args (` {}) type-codes])
_
#None))]
(case parts
- (#Some name args meta type-asts)
+ (#Some name args meta type-codes)
(do Monad<Lux>
- [type+tags?? (unfold-type-def type-asts)
+ [type+tags?? (unfold-type-def type-codes)
module-name current-module-name]
(let [type-name (symbol$ ["" name])
[type tags??] type+tags??
type-meta (: Code
(case tags??
(#Some tags)
- (` {#;tags [(~@ (map (: (-> Text Code)
- (function' [tag]
- (form$ (list (tag$ ["lux" "TextA"])
- (text$ tag)))))
- tags))]
+ (` {#;tags [(~@ (map text$ tags))]
#;type? true})
_
@@ -3740,7 +3835,7 @@
(case type'
(#Some type'')
(return (list (` (;;def: (~@ (export-level exported?)) (~ type-name)
- (~ ($_ meta-ast-merge (with-type-args args)
+ (~ ($_ meta-code-merge (with-type-args args)
(if rec? (' {#;type-rec? true}) (' {}))
type-meta
meta))
@@ -3947,7 +4042,7 @@
#import-alias _alias
#import-refer {#refer-defs _referrals
#refer-open _openings}} importation]
- {#import-name ($_ Text/compose super-name "/" _name)
+ {#import-name ($_ text/compose super-name "/" _name)
#import-alias _alias
#import-refer {#refer-defs _referrals
#refer-open _openings}})))))
@@ -3962,19 +4057,19 @@
[current-module current-module-name]
(case (split-module module)
(^ (list& "." parts))
- (return (|> (list& current-module parts) (interpose "/") reverse (fold Text/compose "")))
+ (return (|> (list& current-module parts) (interpose "/") reverse (fold text/compose "")))
parts
- (let [[ups parts'] (split-with (Text/= "..") parts)
+ (let [[ups parts'] (split-with (text/= "..") parts)
num-ups (length ups)]
(if (i.= num-ups 0)
(return module)
(case (nth num-ups (split-module-contexts current-module))
#None
- (fail (Text/compose "Cannot clean module: " module))
+ (fail (text/compose "Cannot clean module: " module))
(#Some top-module)
- (return (|> (list& top-module parts') (interpose "/") reverse (fold Text/compose ""))))
+ (return (|> (list& top-module parts') (interpose "/") reverse (fold text/compose ""))))
)))
))
@@ -4037,9 +4132,9 @@
_
(do Monad<Lux>
[current-module current-module-name]
- (fail (Text/compose "Wrong syntax for import @ " current-module))))))
+ (fail (text/compose "Wrong syntax for import @ " current-module))))))
imports)]
- (wrap (List/join imports'))))
+ (wrap (list/join imports'))))
(def: (exported-defs module state)
(-> Text (Lux (List Text)))
@@ -4056,17 +4151,17 @@
(function [[name [def-type def-meta def-value]]]
(case [(get-meta ["lux" "export?"] def-meta)
(get-meta ["lux" "hidden?"] def-meta)]
- [(#Some (#BoolA true)) #;None]
+ [(#Some [_ (#Bool true)]) #;None]
(list name)
_
(list))))
- (let [{#module-hash _ #module-aliases _ #defs defs #imports _ #tags tags #types types #module-anns _ #module-state _} =module]
+ (let [{#module-hash _ #module-aliases _ #defs defs #imports _ #tags tags #types types #module-annotations _ #module-state _} =module]
defs))]
- (#Right state (List/join to-alias)))
+ (#Right state (list/join to-alias)))
#None
- (#Left ($_ Text/compose "Unknown module: " module)))
+ (#Left ($_ text/compose "Unknown module: " module)))
))
(def: (filter p xs)
@@ -4084,7 +4179,7 @@
(-> (List Text) Text Bool)
(let [output (fold (function [case prev]
(or prev
- (Text/= case name)))
+ (text/= case name)))
false
cases)]
output))
@@ -4112,7 +4207,7 @@
#captured {#counter _ #mappings closure}}
(try-both (find (: (-> [Text [Type Top]] (Maybe Type))
(function [[bname [type _]]]
- (if (Text/= name bname)
+ (if (text/= name bname)
(#Some type)
#None))))
(: (List [Text [Type Top]]) locals)
@@ -4130,7 +4225,7 @@
#None
#None
- (#Some {#defs defs #module-hash _ #module-aliases _ #imports _ #tags tags #types types #module-anns _ #module-state _})
+ (#Some {#defs defs #module-hash _ #module-aliases _ #imports _ #tags tags #types types #module-annotations _ #module-state _})
(case (get v-name defs)
#None
#None
@@ -4147,12 +4242,12 @@
#scope-type-vars scope-type-vars} state]
(case (get v-prefix modules)
#None
- (#Left (Text/compose "Unknown definition: " (Ident/encode name)))
+ (#Left (text/compose "Unknown definition: " (ident/encode name)))
- (#Some {#defs defs #module-hash _ #module-aliases _ #imports _ #tags tags #types types #module-anns _ #module-state _})
+ (#Some {#defs defs #module-hash _ #module-aliases _ #imports _ #tags tags #types types #module-annotations _ #module-state _})
(case (get v-name defs)
#None
- (#Left (Text/compose "Unknown definition: " (Ident/encode name)))
+ (#Left (text/compose "Unknown definition: " (ident/encode name)))
(#Some [def-type def-meta def-value])
(#Right [state [def-type def-value]])))))
@@ -4163,7 +4258,7 @@
[#let [[module name] ident]
current-module current-module-name]
(function [state]
- (if (Text/= "" module)
+ (if (text/= "" module)
(case (find-in-env name state)
(#Some struct-type)
(#Right state struct-type)
@@ -4174,13 +4269,13 @@
(#Right state struct-type)
_
- (#Left ($_ Text/compose "Unknown var: " (Ident/encode ident)))))
+ (#Left ($_ text/compose "Unknown var: " (ident/encode ident)))))
(case (find-def-type ident state)
(#Some struct-type)
(#Right state struct-type)
_
- (#Left ($_ Text/compose "Unknown var: " (Ident/encode ident)))))
+ (#Left ($_ text/compose "Unknown var: " (ident/encode ident)))))
)))
(def: (zip2 xs ys)
@@ -4206,7 +4301,7 @@
name
_
- ($_ Text/compose "(" name " " (|> params (map Type/show) (interpose " ") reverse (fold Text/compose "")) ")"))
+ ($_ text/compose "(" name " " (|> params (map Type/show) (interpose " ") reverse (fold text/compose "")) ")"))
#Void
"Void"
@@ -4215,38 +4310,38 @@
"Unit"
(#Sum _)
- ($_ Text/compose "(| " (|> (flatten-variant type) (map Type/show) (interpose " ") reverse (fold Text/compose "")) ")")
+ ($_ text/compose "(| " (|> (flatten-variant type) (map Type/show) (interpose " ") reverse (fold text/compose "")) ")")
(#Product _)
- ($_ Text/compose "[" (|> (flatten-tuple type) (map Type/show) (interpose " ") reverse (fold Text/compose "")) "]")
+ ($_ text/compose "[" (|> (flatten-tuple type) (map Type/show) (interpose " ") reverse (fold text/compose "")) "]")
(#Function _)
- ($_ Text/compose "(-> " (|> (flatten-lambda type) (map Type/show) (interpose " ") reverse (fold Text/compose "")) ")")
+ ($_ text/compose "(-> " (|> (flatten-lambda type) (map Type/show) (interpose " ") reverse (fold text/compose "")) ")")
(#Bound id)
- (Nat/encode id)
+ (nat/encode id)
(#Var id)
- ($_ Text/compose "⌈v:" (Nat/encode id) "⌋")
+ ($_ text/compose "⌈v:" (nat/encode id) "⌋")
(#Ex id)
- ($_ Text/compose "⟨e:" (Nat/encode id) "⟩")
+ ($_ text/compose "⟨e:" (nat/encode id) "⟩")
(#UnivQ env body)
- ($_ Text/compose "(All " (Type/show body) ")")
+ ($_ text/compose "(All " (Type/show body) ")")
(#ExQ env body)
- ($_ Text/compose "(Ex " (Type/show body) ")")
+ ($_ text/compose "(Ex " (Type/show body) ")")
(#Apply _)
(let [[func args] (flatten-app type)]
- ($_ Text/compose
+ ($_ text/compose
"(" (Type/show func) " "
- (|> args (map Type/show) (interpose " ") reverse (fold Text/compose ""))
+ (|> args (map Type/show) (interpose " ") reverse (fold text/compose ""))
")"))
(#Named [prefix name] _)
- ($_ Text/compose prefix ";" name)
+ ($_ text/compose prefix ";" name)
))
(def: (foldM Monad<m> f init inputs)
@@ -4271,7 +4366,7 @@
struct-evidence (resolve-type-tags init-type)]
(case struct-evidence
#;None
- (fail (Text/compose "Can only \"open\" structs: " (Type/show init-type)))
+ (fail (text/compose "Can only \"open\" structs: " (Type/show init-type)))
(#;Some tags&members)
(do Monad<Lux>
@@ -4279,7 +4374,7 @@
(function recur [source [tags members] target]
(let [pattern (record$ (map (function [[t-module t-name]]
[(tag$ [t-module t-name])
- (symbol$ ["" (Text/compose prefix t-name)])])
+ (symbol$ ["" (text/compose prefix t-name)])])
tags))]
(do Monad<Lux>
[enhanced-target (foldM Monad<Lux>
@@ -4288,7 +4383,7 @@
[m-structure (resolve-type-tags m-type)]
(case m-structure
(#;Some m-tags&members)
- (recur ["" (Text/compose prefix m-name)]
+ (recur ["" (text/compose prefix m-name)]
m-tags&members
enhanced-target)
@@ -4413,11 +4508,11 @@
(: (-> [Ident Type] (Lux (List Code)))
(function [[sname stype]] (open-field prefix sname source+ stype)))
(zip2 tags members))]
- (return (List/join decls')))
+ (return (list/join decls')))
_
- (return (list (` (;_lux_def (~ (symbol$ ["" (Text/compose prefix name)])) (~ source+)
- #Nil)))))))
+ (return (list (` (;_lux_def (~ (symbol$ ["" (text/compose prefix name)])) (~ source+)
+ [(~ cursor-code) (#;Record #Nil)])))))))
(macro: #export (open tokens)
{#;doc "## Opens a structure and generates a definition for each of its members (including nested members).
@@ -4447,34 +4542,34 @@
[decls' (mapM Monad<Lux> (: (-> [Ident Type] (Lux (List Code)))
(function [[sname stype]] (open-field prefix sname source stype)))
(zip2 tags members))]
- (return (List/join decls')))
+ (return (list/join decls')))
_
- (fail (Text/compose "Can only \"open\" structs: " (Type/show struct-type)))))
+ (fail (text/compose "Can only \"open\" structs: " (Type/show struct-type)))))
_
(fail "Wrong syntax for open")))
(macro: #export (|>. tokens)
{#;doc "## Similar to the piping macro, but rather than taking an initial object to work on, creates a function for taking it.
- (|>. (map Int/encode) (interpose \" \") (fold Text/compose \"\"))
+ (|>. (map int/encode) (interpose \" \") (fold text/compose \"\"))
## =>
(function [<arg>]
- (fold Text/compose \"\"
+ (fold text/compose \"\"
(interpose \" \"
- (map Int/encode <arg>))))"}
+ (map int/encode <arg>))))"}
(do Monad<Lux>
[g!arg (gensym "arg")]
(return (list (` (function [(~ g!arg)] (|> (~ g!arg) (~@ tokens))))))))
(macro: #export (<|. tokens)
{#;doc "## Similar to the piping macro, but rather than taking an initial object to work on, creates a function for taking it.
- (<|. (fold Text/compose \"\") (interpose \" \") (map Int/encode))
+ (<|. (fold text/compose \"\") (interpose \" \") (map int/encode))
## =>
(function [<arg>]
- (fold Text/compose \"\"
+ (fold text/compose \"\"
(interpose \" \"
- (map Int/encode <arg>))))"}
+ (map int/encode <arg>))))"}
(do Monad<Lux>
[g!arg (gensym "arg")]
(return (list (` (function [(~ g!arg)] (<| (~@ tokens) (~ g!arg))))))))
@@ -4483,7 +4578,7 @@
(-> Text Text (Lux Bool))
(do Monad<Lux>
[module (find-module module-name)
- #let [{#module-hash _ #module-aliases _ #defs _ #imports imports #tags _ #types _ #module-anns _ #module-state _} module]]
+ #let [{#module-hash _ #module-aliases _ #defs _ #imports imports #tags _ #types _ #module-annotations _ #module-state _} module]]
(wrap (is-member? imports import-name))))
(def: (read-refer module-name options)
@@ -4501,7 +4596,7 @@
(function [_def]
(if (is-member? all-defs _def)
(return [])
- (fail ($_ Text/compose _def " is not defined in module " module-name " @ " current-module)))))
+ (fail ($_ text/compose _def " is not defined in module " module-name " @ " current-module)))))
referred-defs)))]]
(case options
#;Nil
@@ -4509,11 +4604,11 @@
#refer-open openings})
_
- (fail ($_ Text/compose "Wrong syntax for refer @ " current-module
+ (fail ($_ text/compose "Wrong syntax for refer @ " current-module
"\n" (|> options
- (map ast-to-text)
+ (map code-to-text)
(interpose " ")
- (fold Text/compose "")))))))
+ (fold text/compose "")))))))
(def: (write-refer module-name [r-defs r-opens])
(-> Text Refer (Lux (List Code)))
@@ -4526,7 +4621,7 @@
(function [_def]
(if (is-member? all-defs _def)
(return [])
- (fail ($_ Text/compose _def " is not defined in module " module-name " @ " current-module)))))
+ (fail ($_ text/compose _def " is not defined in module " module-name " @ " current-module)))))
referred-defs)))]
defs' (case r-defs
#All
@@ -4550,15 +4645,17 @@
(function [def]
(` (;_lux_def (~ (symbol$ ["" def]))
(~ (symbol$ [module-name def]))
- (#Cons [["lux" "alias"] (#IdentA [(~ (text$ module-name)) (~ (text$ def))])]
- #Nil)))))
+ [(~ cursor-code)
+ (#;Record (#Cons [[(~ cursor-code) (#;Tag ["lux" "alias"])]
+ [(~ cursor-code) (#;Symbol [(~ (text$ module-name)) (~ (text$ def))])]]
+ #Nil))]))))
defs')
openings (join-map (: (-> Openings (List Code))
(function [[prefix structs]]
(map (function [[_ name]] (` (open (~ (symbol$ [module-name name])) (~ (text$ prefix)))))
structs)))
r-opens)]]
- (wrap (List/compose defs openings))
+ (wrap (list/compose defs openings))
))
(macro: #hidden (refer tokens)
@@ -4571,7 +4668,7 @@
_
(fail "Wrong syntax for refer")))
-(def: (refer-to-ast module-name [r-defs r-opens])
+(def: (refer-to-code module-name [r-defs r-opens])
(-> Text Refer Code)
(let [=defs (: (List Code)
(case r-defs
@@ -4604,23 +4701,23 @@
(;module: {#;doc \"Some documentation...\"}
lux
(lux (control (monad #as M #refer #all))
- (data (text #open (\"Text/\" Monoid<Text>))
- (coll (list #open (\"List/\" Monad<List>)))
+ (data (text #open (\"text/\" Monoid<Text>))
+ (coll (list #open (\"list/\" Monad<List>)))
maybe
- (ident #open (\"Ident/\" Codec<Text,Ident>)))
+ (ident #open (\"ident/\" Codec<Text,Ident>)))
meta
- (macro ast))
+ (macro code))
(.. (type #open (\"\" Eq<Type>))))
(;module: {#;doc \"Some documentation...\"}
lux
(lux (control [\"M\" monad #*])
- (data [text \"Text/\" Monoid<Text>]
- (coll [list \"List/\" Monad<List>])
+ (data [text \"text/\" Monoid<Text>]
+ (coll [list \"list/\" Monad<List>])
maybe
- [ident \"Ident/\" Codec<Text,Ident>])
+ [ident \"ident/\" Codec<Text,Ident>])
meta
- (macro ast))
+ (macro code))
(.. [type \"\" Eq<Type>]))"}
(do Monad<Lux>
[#let [[_meta _imports] (: [(List [Code Code]) (List Code)]
@@ -4637,11 +4734,12 @@
imports)
=refers (map (: (-> Importation Code)
(function [[m-name m-alias =refer]]
- (refer-to-ast m-name =refer)))
- imports)]
- =meta (process-def-meta (record$ (list& [(` #;imports) (` [(~@ =imports)])]
- _meta)))
- #let [=module (` (;_lux_module (~ =meta)))]]
+ (refer-to-code m-name =refer)))
+ imports)
+ =meta (process-def-meta (list& [(` #;imports) (` [(~@ =imports)])]
+ _meta))
+ =module (` (;_lux_module [(~ cursor-code)
+ (#;Record (~ =meta))]))]]
(wrap (#;Cons =module =refers))))
(macro: #export (:: tokens)
@@ -4728,7 +4826,7 @@
(#;Cons (list new-binding old-record) accesses')]))
[record (: (List (List Code)) #;Nil)]
pairs)
- accesses (List/join (reverse accesses'))]]
+ accesses (list/join (reverse accesses'))]]
(wrap (list (` (let [(~@ accesses)]
(~ update-expr)))))))
@@ -4824,7 +4922,7 @@
(-> (List Type) Type Type)
(case type
(#;Host name params)
- (#;Host name (List/map (beta-reduce env) params))
+ (#;Host name (list/map (beta-reduce env) params))
(^template [<tag>]
(<tag> left right)
@@ -4870,7 +4968,7 @@
wrap))
#;None)))
(#Some output)
- (return (List/compose output branches))
+ (return (list/compose output branches))
#None
(fail "Wrong syntax for ^template"))
@@ -4887,9 +4985,9 @@
[int-to-frac Int Frac ["int" "to-frac"]]
)
-(def: (find-baseline-column ast)
+(def: (find-baseline-column code)
(-> Code Nat)
- (case ast
+ (case code
(^template [<tag>]
[[_ _ column] (<tag> _)]
column)
@@ -4910,7 +5008,7 @@
[[_ _ column] (#Record pairs)]
(fold n.min column
- (List/compose (map (. find-baseline-column first) pairs)
+ (list/compose (map (. find-baseline-column first) pairs)
(map (. find-baseline-column second) pairs)))
))
@@ -4918,16 +5016,16 @@
(#Doc-Comment Text)
(#Doc-Example Code))
-(def: (identify-doc-fragment ast)
+(def: (identify-doc-fragment code)
(-> Code Doc-Fragment)
- (case ast
+ (case code
[_ (#;Text comment)]
(#Doc-Comment comment)
_
- (#Doc-Example ast)))
+ (#Doc-Example code)))
-(def: (Text/encode original)
+(def: (text/encode original)
(-> Text Text)
(let [escaped (|> original
(replace-all "\t" "\\t")
@@ -4939,7 +5037,7 @@
(replace-all "\"" "\\\"")
(replace-all "\\" "\\\\")
)]
- ($_ Text/compose "\"" escaped "\"")))
+ ($_ text/compose "\"" escaped "\"")))
(do-template [<name> <op> <one> <type> <doc>]
[(def: #export (<name> value)
@@ -4953,9 +5051,9 @@
[n.dec n.- +1 Nat "[Nat] Decrement function."]
)
-(def: Tag/encode
+(def: tag/encode
(-> Ident Text)
- (. (Text/compose "#") Ident/encode))
+ (. (text/compose "#") ident/encode))
(do-template [<name> <op> <from> <to>]
[(def: #export (<name> input)
@@ -4977,22 +5075,22 @@
(def: (cursor-padding baseline [_ old-line old-column] [_ new-line new-column])
(-> Nat Cursor Cursor Text)
(if (n.= old-line new-line)
- (Text/join (repeat (nat-to-int (n.- old-column new-column)) " "))
- (let [extra-lines (Text/join (repeat (nat-to-int (n.- old-line new-line)) "\n"))
- space-padding (Text/join (repeat (nat-to-int (n.- baseline new-column)) " "))]
- (Text/compose extra-lines space-padding))))
+ (text/join (repeat (nat-to-int (n.- old-column new-column)) " "))
+ (let [extra-lines (text/join (repeat (nat-to-int (n.- old-line new-line)) "\n"))
+ space-padding (text/join (repeat (nat-to-int (n.- baseline new-column)) " "))]
+ (text/compose extra-lines space-padding))))
-(def: (Text/size x)
+(def: (text/size x)
(-> Text Nat)
(_lux_proc ["text" "size"] [x]))
-(def: (Text/trim x)
+(def: (text/trim x)
(-> Text Text)
(_lux_proc ["text" "trim"] [x]))
-(def: (update-cursor [file line column] ast-text)
+(def: (update-cursor [file line column] code-text)
(-> Cursor Text Cursor)
- [file line (n.+ column (Text/size ast-text))])
+ [file line (n.+ column (text/size code-text))])
(def: (delim-update-cursor [file line column])
(-> Cursor Cursor)
@@ -5000,7 +5098,7 @@
(def: rejoin-all-pairs
(-> (List [Code Code]) (List Code))
- (. List/join (map rejoin-pair)))
+ (. list/join (map rejoin-pair)))
(def: (doc-example->Text prev-cursor baseline example)
(-> Cursor Nat Code [Cursor Text])
@@ -5009,25 +5107,25 @@
[new-cursor (<tag> value)]
(let [as-text (<show> value)]
[(update-cursor new-cursor as-text)
- (Text/compose (cursor-padding baseline prev-cursor new-cursor)
+ (text/compose (cursor-padding baseline prev-cursor new-cursor)
as-text)]))
- ([#Bool Bool/encode]
- [#Nat Nat/encode]
- [#Int Int/encode]
- [#Frac Frac/encode]
- [#Text Text/encode]
- [#Symbol Ident/encode]
- [#Tag Tag/encode])
+ ([#Bool bool/encode]
+ [#Nat nat/encode]
+ [#Int int/encode]
+ [#Frac frac/encode]
+ [#Text text/encode]
+ [#Symbol ident/encode]
+ [#Tag tag/encode])
(^template [<tag> <open> <close> <prep>]
[group-cursor (<tag> parts)]
(let [[group-cursor' parts-text] (fold (function [part [last-cursor text-accum]]
(let [[part-cursor part-text] (doc-example->Text last-cursor baseline part)]
- [part-cursor (Text/compose text-accum part-text)]))
+ [part-cursor (text/compose text-accum part-text)]))
[(delim-update-cursor group-cursor) ""]
(<prep> parts))]
[(delim-update-cursor group-cursor')
- ($_ Text/compose (cursor-padding baseline prev-cursor group-cursor)
+ ($_ text/compose (cursor-padding baseline prev-cursor group-cursor)
<open>
parts-text
<close>)]))
@@ -5049,14 +5147,14 @@
(#Doc-Comment comment)
(|> comment
(split-text "\n")
- (map (function [line] ($_ Text/compose "## " line "\n")))
- Text/join)
+ (map (function [line] ($_ text/compose "## " line "\n")))
+ text/join)
(#Doc-Example example)
(let [baseline (find-baseline-column example)
[cursor _] example
[_ text] (doc-example->Text (with-baseline baseline cursor) baseline example)]
- (Text/compose text "\n\n"))))
+ (text/compose text "\n\n"))))
(macro: #export (doc tokens)
{#;doc "## Creates code documentation, embedding text as comments and properly formatting the forms it's being given.
@@ -5069,11 +5167,12 @@
(if (< 10 count)
(recur (i.inc count) (f x))
x)))"}
- (return (list (` (#;TextA (~ (|> tokens
+ (return (list (` [(~ cursor-code)
+ (#;Text (~ (|> tokens
(map (. doc-fragment->Text identify-doc-fragment))
- Text/join
- Text/trim
- text$)))))))
+ text/join
+ text/trim
+ text$)))]))))
(def: (interleave xs ys)
(All [a] (-> (List a) (List a) (List a)))
@@ -5089,11 +5188,11 @@
(#Cons y ys')
(list& x y (interleave xs' ys')))))
-(def: (type-to-ast type)
+(def: (type-to-code type)
(-> Type Code)
(case type
(#Host name params)
- (` (#Host (~ (text$ name)) (~ (untemplate-list (map type-to-ast params)))))
+ (` (#Host (~ (text$ name)) (~ (untemplate-list (map type-to-code params)))))
#Void
(` #Void)
@@ -5103,11 +5202,11 @@
(^template [<tag>]
(<tag> left right)
- (` (<tag> (~ (type-to-ast left)) (~ (type-to-ast right)))))
+ (` (<tag> (~ (type-to-code left)) (~ (type-to-code right)))))
([#Sum] [#Product])
(#Function in out)
- (` (#Function (~ (type-to-ast in)) (~ (type-to-ast out))))
+ (` (#Function (~ (type-to-code in)) (~ (type-to-code out))))
(#Bound idx)
(` (#Bound (~ (nat$ idx))))
@@ -5119,18 +5218,18 @@
(` (#Ex (~ (nat$ id))))
(#UnivQ env type)
- (let [env' (untemplate-list (map type-to-ast env))]
- (` (#UnivQ (~ env') (~ (type-to-ast type)))))
+ (let [env' (untemplate-list (map type-to-code env))]
+ (` (#UnivQ (~ env') (~ (type-to-code type)))))
(#ExQ env type)
- (let [env' (untemplate-list (map type-to-ast env))]
- (` (#ExQ (~ env') (~ (type-to-ast type)))))
+ (let [env' (untemplate-list (map type-to-code env))]
+ (` (#ExQ (~ env') (~ (type-to-code type)))))
(#Apply arg fun)
- (` (#Apply (~ (type-to-ast arg)) (~ (type-to-ast fun))))
+ (` (#Apply (~ (type-to-code arg)) (~ (type-to-code fun))))
(#Named [module name] type)
- (` (#Named [(~ (text$ module)) (~ (text$ name))] (~ (type-to-ast type))))
+ (` (#Named [(~ (text$ module)) (~ (text$ name))] (~ (type-to-code type))))
))
(macro: #export (loop tokens)
@@ -5154,8 +5253,8 @@
#None (fail "Wrong syntax for loop")))
init-types (mapM Monad<Lux> find-type inits')
expected get-expected-type]
- (return (list (` ((;_lux_: (-> (~@ (map type-to-ast init-types))
- (~ (type-to-ast expected)))
+ (return (list (` ((;_lux_: (-> (~@ (map type-to-code init-types))
+ (~ (type-to-code expected)))
(function (~ (symbol$ ["" "recur"])) [(~@ vars)]
(~ body)))
(~@ inits))))))
@@ -5218,8 +5317,8 @@
(#Some (list target))
[_ (#Symbol [prefix name])]
- (if (and (Text/= "" prefix)
- (Text/= label name))
+ (if (and (text/= "" prefix)
+ (text/= label name))
(#Some tokens)
(#Some (list target)))
@@ -5227,7 +5326,7 @@
[_ (<tag> elems)]
(do Monad<Maybe>
[placements (mapM Monad<Maybe> (place-tokens label tokens) elems)]
- (wrap (list (<ctor> (List/join placements))))))
+ (wrap (list (<ctor> (list/join placements))))))
([#Tuple tuple$]
[#Form form$])
@@ -5334,13 +5433,13 @@
["Text" Text text$])
_
- (fail (Text/compose "Cannot anti-quote type: " (Ident/encode name))))))
+ (fail (text/compose "Cannot anti-quote type: " (ident/encode name))))))
(def: (anti-quote token)
(-> Code (Lux Code))
(case token
[_ (#Symbol [def-prefix def-name])]
- (if (Text/= "" def-prefix)
+ (if (text/= "" def-prefix)
(:: Monad<Lux> return token)
(anti-quote-def [def-prefix def-name]))
@@ -5437,7 +5536,7 @@
"Useful in situations where the result of a branch depends on further refinements on the values being matched."
"For example:"
(case (split (size static) uri)
- (^multi (#;Some [chunk uri']) [(Text/= static chunk) true])
+ (^multi (#;Some [chunk uri']) [(text/= static chunk) true])
(match-uri endpoint? parts' uri')
_
@@ -5446,7 +5545,7 @@
"Short-cuts can be taken when using boolean tests."
"The example above can be rewritten as..."
(case (split (size static) uri)
- (^multi (#;Some [chunk uri']) (Text/= static chunk))
+ (^multi (#;Some [chunk uri']) (text/= static chunk))
(match-uri endpoint? parts' uri')
_
@@ -5458,7 +5557,7 @@
expected get-expected-type
g!temp (gensym "temp")]
(let [output (list g!temp
- (` (;_lux_case (;_lux_: (#;Apply (~ (type-to-ast expected)) Maybe)
+ (` (;_lux_case (;_lux_: (#;Apply (~ (type-to-code expected)) Maybe)
(case (~ g!temp)
(~@ (multi-level-case$ g!temp [mlc body]))
@@ -5527,7 +5626,7 @@
"In the example below, +0 corresponds to the 'a' variable."
(def: #export (from-list list)
(All [a] (-> (List a) (Vector a)))
- (List/fold add
+ (list/fold add
(: (Vector ($ +0))
empty)
list)))}
@@ -5540,7 +5639,7 @@
(wrap (list (` (#Ex (~ (nat$ var-id))))))
#;None
- (fail (Text/compose "Indexed-type does not exist: " (Nat/encode idx)))))
+ (fail (text/compose "Indexed-type does not exist: " (nat/encode idx)))))
_
(fail "Wrong syntax for $")))
@@ -5559,7 +5658,7 @@
(macro: #export (^@ tokens)
{#;doc (doc "Allows you to simultaneously bind and de-structure a value."
(def: (hash (^@ set [Hash<a> _]))
- (List/fold (function [elem acc] (n.+ (:: Hash<a> hash elem) acc))
+ (list/fold (function [elem acc] (n.+ (:: Hash<a> hash elem) acc))
+0
(to-list set))))}
(case tokens
@@ -5595,7 +5694,7 @@
(^ (list expr))
(do Monad<Lux>
[type get-expected-type]
- (wrap (list (` (;_lux_:! (~ (type-to-ast type)) (~ expr))))))
+ (wrap (list (` (;_lux_:! (~ (type-to-code type)) (~ expr))))))
_
(fail "Wrong syntax for :!!")))
@@ -5624,7 +5723,7 @@
(^ (list [_ (#;Symbol var-name)]))
(do Monad<Lux>
[var-type (find-type var-name)]
- (wrap (list (type-to-ast var-type))))
+ (wrap (list (type-to-code var-type))))
_
(fail "Wrong syntax for type-of")))
@@ -5739,7 +5838,7 @@
(list (` (~ (replace-syntax rep-env input-template))))])
(~ g!_)
- (#;Left (~ (text$ (Text/compose "Wrong syntax for " name))))
+ (#;Left (~ (text$ (text/compose "Wrong syntax for " name))))
)))))
))