aboutsummaryrefslogtreecommitdiff
path: root/source/lux.lux
diff options
context:
space:
mode:
authorEduardo Julian2015-04-19 19:50:10 -0400
committerEduardo Julian2015-04-19 19:50:10 -0400
commite1df2642c538293f1dfd0faffad72b48a626148a (patch)
treeba62cd4c50b193a8c147957f7ca6339f16dd1ff3 /source/lux.lux
parent6676e1bb8e79ed4336b113b573f3b9f9dd8399af (diff)
- Fixed several bugs in lux.lux
- Fixed an error in lux.base/analyse-2 - Modified the analyser so the symbols that identify all of the special forms must mandatorily have "" as their prefix. - Fixed a bug in the binary operations at lux.analyser.host wherein the types where being omitted. - Fixed a bug when closing-over variables inside lambda bodies wherein the names of bindings where being stores as (incomparable) arrays, instead of as (comparable) strings.
Diffstat (limited to '')
-rw-r--r--source/lux.lux2346
1 files changed, 1258 insertions, 1088 deletions
diff --git a/source/lux.lux b/source/lux.lux
index a08c88db7..b03de7473 100644
--- a/source/lux.lux
+++ b/source/lux.lux
@@ -25,6 +25,7 @@
## Basic types
(def' Any #AnyT)
+(def' Nothing #NothingT)
(def' Bool (#DataT "java.lang.Boolean"))
(def' Int (#DataT "java.lang.Long"))
(def' Real (#DataT "java.lang.Double"))
@@ -163,6 +164,15 @@
(#Cons [["lux;eval-ctor" Int]
#Nil])])])])])])])])]))))
+## (deftype (Syntax' f)
+## (f (| (#Bool Bool)
+## (#Int Int)
+## (#Real Real)
+## (#Char Char)
+## (#Text Text)
+## (#Form (List (Syntax' f)))
+## (#Tuple (List (Syntax' f)))
+## (#Record (List (, Text (Syntax' f)))))))
## (deftype #rec Syntax
## (Meta Cursor (| (#Bool Bool)
## (#Int Int)
@@ -172,24 +182,69 @@
## (#Form (List Syntax))
## (#Tuple (List Syntax))
## (#Record (List (, Text Syntax))))))
+## (deftype (Syntax' w)
+## (| (#Bool Bool)
+## (#Int Int)
+## (#Real Real)
+## (#Char Char)
+## (#Text Text)
+## (#Symbol (, Text Text))
+## (#Tag (, Text Text))
+## (#Form (List (w (Syntax' w))))
+## (#Tuple (List (w (Syntax' w))))
+## (#Record (List (, Text (w (Syntax' w)))))))
+(def' Syntax'
+ (check' Type
+ (case' (#AppT [(#BoundT "w")
+ (#AppT [(#BoundT "Syntax'")
+ (#BoundT "w")])])
+ Syntax'
+ (case' (#AppT [List Syntax'])
+ Syntax'List
+ (case' (#TupleT (#Cons [Text (#Cons [Text #Nil])]))
+ Ident
+ (#AllT [#Nil "Syntax'" "w"
+ (#VariantT (#Cons [["lux;Bool" Bool]
+ (#Cons [["lux;Int" Int]
+ (#Cons [["lux;Real" Real]
+ (#Cons [["lux;Char" Char]
+ (#Cons [["lux;Text" Text]
+ (#Cons [["lux;Symbol" Ident]
+ (#Cons [["lux;Tag" Ident]
+ (#Cons [["lux;Form" Syntax'List]
+ (#Cons [["lux;Tuple" Syntax'List]
+ (#Cons [["lux;Record" (#AppT [List (#TupleT (#Cons [Text (#Cons [Syntax' #Nil])]))])]
+ #Nil])
+ ])])])])])])])])])
+ )])
+ )))))
+
+## (deftype Syntax
+## (Meta Cursor (Syntax' (Meta Cursor))))
(def' Syntax
(check' Type
- (case' (#AppT [(#BoundT "Syntax") (#BoundT "")])
- Syntax
- (case' (#AppT [List Syntax])
- SyntaxList
- (#AppT [(#AllT [#Nil "Syntax" ""
- (#AppT [(#AppT [Meta Cursor])
- (#VariantT (#Cons [["lux;Bool" Bool]
- (#Cons [["lux;Int" Int]
- (#Cons [["lux;Real" Real]
- (#Cons [["lux;Char" Char]
- (#Cons [["lux;Text" Text]
- (#Cons [["lux;Form" SyntaxList]
- (#Cons [["lux;Tuple" SyntaxList]
- (#Cons [["lux;Record" (#AppT [List (#TupleT (#Cons [Text (#Cons [Syntax #Nil])]))])]
- #Nil])])])])])])])]))])])
- #NothingT])))))
+ (case' (#AppT [Meta Cursor])
+ w
+ (#AppT [w (#AppT [Syntax' w])]))))
+
+## (def' Syntax
+## (check' Type
+## (case' (#AppT [(#BoundT "Syntax") (#BoundT "")])
+## Syntax
+## (case' (#AppT [List Syntax])
+## SyntaxList
+## (#AppT [(#AllT [#Nil "Syntax" ""
+## (#AppT [(#AppT [Meta Cursor])
+## (#VariantT (#Cons [["lux;Bool" Bool]
+## (#Cons [["lux;Int" Int]
+## (#Cons [["lux;Real" Real]
+## (#Cons [["lux;Char" Char]
+## (#Cons [["lux;Text" Text]
+## (#Cons [["lux;Form" SyntaxList]
+## (#Cons [["lux;Tuple" SyntaxList]
+## (#Cons [["lux;Record" (#AppT [List (#TupleT (#Cons [Text (#Cons [Syntax #Nil])]))])]
+## #Nil])])])])])])])]))])])
+## #NothingT])))))
## (deftype (Either l r)
## (| (#Left l)
@@ -202,6 +257,16 @@
(#Cons [["lux;Right" (#BoundT "r")]
#Nil])]))])])))
+## (deftype MacroOutput
+## (Either Text [CompilerState (List Syntax)]))
+## (def' MacroOutput
+## (check' Type
+## (case' (#AppT [List Syntax])
+## SyntaxList
+## (#AppT [(#AppT [Either Text])
+## (#TupleT (#Cons [CompilerState
+## (#Cons [SyntaxList #Nil])]))]))))
+
## (deftype Macro
## (-> (List Syntax) CompilerState
## (Either Text [CompilerState (List Syntax)])))
@@ -213,1093 +278,1198 @@
(#LambdaT [CompilerState
(#AppT [(#AppT [Either Text])
(#TupleT (#Cons [CompilerState
- (#Cons [SyntaxList #Nil])]))])])]))))
+ (#Cons [SyntaxList
+ #Nil])]))])])]))))
## Base functions & macros
## (def (_meta data)
-## (All [a] (-> a (Meta Cursor a)))
+## (-> (Syntax' (Meta Cursor)) Syntax)
## (#Meta [["" -1 -1] data]))
(def' _meta
- (check' (#AllT [#Nil "_" "a"
- (#LambdaT [(#BoundT "a")
- (#AppT [(#AppT [Meta Cursor])
- (#BoundT "a")])])])
+ (check' (#LambdaT [(#AppT [Syntax'
+ (#AppT [Meta Cursor])])
+ Syntax])
(lambda' _ data
(#Meta [["" -1 -1] data]))))
-## (def' let'
-## (check' Macro
-## (lambda' _ tokens
-## (lambda' _ state
-## (case' tokens
-## (#Cons [lhs (#Cons [rhs (#Cons [body #Nil])])])
-## (#Right [state
-## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "case'"]))
-## (#Cons [rhs (#Cons [lhs (#Cons [body #Nil])])])])))
-## #Nil])])
-
-## _
-## (#Left "Wrong syntax for let'"))
-## ))))
+## (def (return' x)
+## (-> SyntaxList CompilerState
+## (Either Text (, CompilerState SyntaxList)))
+## ...)
+(def' return'
+ (check' (case' (#AppT [List Syntax])
+ SyntaxList
+ (#LambdaT [SyntaxList
+ (#LambdaT [CompilerState
+ (#AppT [(#AppT [Either Text])
+ (#TupleT (#Cons [CompilerState
+ (#Cons [SyntaxList
+ #Nil])]))])])]))
+ (lambda' _ val
+ (lambda' _ state
+ (#Right [state val])))))
+
+## (def (fail' msg)
+## (-> Text CompilerState
+## (Either Text (, CompilerState SyntaxList)))
+## ...)
+(def' fail'
+ (check' (case' (#AppT [List Syntax])
+ SyntaxList
+ (#LambdaT [Text
+ (#LambdaT [CompilerState
+ (#AppT [(#AppT [Either Text])
+ (#TupleT (#Cons [CompilerState
+ (#Cons [SyntaxList
+ #Nil])]))])])]))
+ (lambda' _ msg
+ (lambda' _ state
+ (#Left msg)))))
## (def' let'
## (check' Macro
## (lambda' _ tokens
-## (lambda' _ state
-## (#Left "Wrong syntax for let'")
-## ))))
+## (case' tokens
+## (#Cons [lhs (#Cons [rhs (#Cons [body #Nil])])])
+## (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "case'"]))
+## (#Cons [rhs (#Cons [lhs (#Cons [body #Nil])])])])))
+## #Nil]))
+
+## _
+## (#Left "Wrong syntax for let'")))))
+(def' let'
+ (check' Macro
+ (lambda' _ tokens
+ (case' tokens
+ (#Cons [lhs (#Cons [rhs (#Cons [body #Nil])])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "case'"]))
+ (#Cons [rhs (#Cons [lhs (#Cons [body #Nil])])])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for let'")))))
+(declare-macro' let')
+
+(def' lambda
+ (check' Macro
+ (lambda' _ tokens
+ (case' tokens
+ (#Cons [(#Meta [_ (#Tuple (#Cons [arg args']))]) (#Cons [body #Nil])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "lambda'"]))
+ (#Cons [(_meta (#Symbol ["" ""]))
+ (#Cons [arg
+ (#Cons [(case' args'
+ #Nil
+ body
+
+ _
+ (_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
+ (#Cons [(_meta (#Tuple args'))
+ (#Cons [body #Nil])])]))))
+ #Nil])])])])))
+ #Nil]))
+
+ (#Cons [(#Meta [_ (#Symbol self)]) (#Cons [(#Meta [_ (#Tuple (#Cons [arg args']))]) (#Cons [body #Nil])])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "lambda'"]))
+ (#Cons [(_meta (#Symbol self))
+ (#Cons [arg
+ (#Cons [(case' args'
+ #Nil
+ body
+
+ _
+ (_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
+ (#Cons [(_meta (#Tuple args'))
+ (#Cons [body #Nil])])]))))
+ #Nil])])])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for lambda")))))
+(declare-macro' lambda)
+
+(def' def
+ (check' Macro
+ (lambda [tokens]
+ (case' tokens
+ (#Cons [(#Meta [_ (#Symbol name)]) (#Cons [body #Nil])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"])) tokens])))
+ #Nil]))
+
+ (#Cons [(#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol name)]) args]))])
+ (#Cons [body #Nil])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"]))
+ (#Cons [(_meta (#Symbol name))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
+ (#Cons [(_meta (#Symbol name))
+ (#Cons [(_meta (#Tuple args))
+ (#Cons [body #Nil])])])])))
+ #Nil])])])))
+ #Nil]))
+
+ (#Cons [(#Meta [_ (#Symbol name)]) (#Cons [type (#Cons [body #Nil])])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"]))
+ (#Cons [(_meta (#Symbol name))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "check'"]))
+ (#Cons [type
+ (#Cons [body
+ #Nil])])])))
+ #Nil])])])))
+ #Nil]))
+
+ (#Cons [(#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol name)]) args]))])
+ (#Cons [type (#Cons [body #Nil])])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"]))
+ (#Cons [(_meta (#Symbol name))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "check'"]))
+ (#Cons [type
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
+ (#Cons [(_meta (#Symbol name))
+ (#Cons [(_meta (#Tuple args))
+ (#Cons [body #Nil])])])])))
+ #Nil])])])))
+ #Nil])])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for def")
+ ))))
+(declare-macro' def)
+
+(def (defmacro tokens)
+ Macro
+ (case' tokens
+ (#Cons [(#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol fn-name)]) args]))])
+ (#Cons [body #Nil])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "def"]))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol fn-name)) args])))
+ (#Cons [(_meta (#Symbol ["lux" "Macro"]))
+ (#Cons [body
+ #Nil])])
+ ])])))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "declare-macro'"])) (#Cons [(_meta (#Symbol fn-name)) #Nil])])))
+ #Nil])]))
+
+ _
+ (fail' "Wrong syntax for defmacro")))
+(declare-macro' defmacro)
+
+(defmacro (comment tokens)
+ (return' #Nil))
+
+(defmacro (->' tokens)
+ (case' tokens
+ (#Cons [input (#Cons [output #Nil])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Tag ["lux" "LambdaT"]))
+ (#Cons [(_meta (#Tuple (#Cons [input (#Cons [output #Nil])])))
+ #Nil])])))
+ #Nil]))
+
+ (#Cons [input (#Cons [output others])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Tag ["lux" "LambdaT"]))
+ (#Cons [(_meta (#Tuple (#Cons [input
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "->'"]))
+ (#Cons [output others])])))
+ #Nil])])))
+ #Nil])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for ->'")))
+
+(def (int+ x y)
+ (->' Int Int Int)
+ (jvm-ladd x y))
+
+(defmacro (All' tokens)
+ (case' tokens
+ (#Cons [(#Meta [_ (#Tuple #Nil)])
+ (#Cons [body #Nil])])
+ (return' (#Cons [body
+ #Nil]))
+
+ (#Cons [(#Meta [_ (#Tuple (#Cons [(#Meta [_ (#Symbol ["" arg-name])]) other-args]))])
+ (#Cons [body #Nil])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Tag ["lux" "AllT"]))
+ (#Cons [(_meta (#Tuple (#Cons [(_meta (#Tag ["lux" "Nil"]))
+ (#Cons [(_meta (#Text ""))
+ (#Cons [(_meta (#Text arg-name))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "All'"]))
+ (#Cons [(_meta (#Tuple other-args))
+ (#Cons [body
+ #Nil])])])))
+ #Nil])])])])))
+ #Nil])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for All'")))
+
+(defmacro (B' tokens)
+ (case' tokens
+ (#Cons [(#Meta [_ (#Symbol ["" bound-name])])
+ #Nil])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Tag ["lux" "BoundT"]))
+ (#Cons [(_meta (#Text bound-name))
+ #Nil])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for B'")))
+
+(defmacro ($' tokens)
+ (case' tokens
+ (#Cons [x #Nil])
+ (return' tokens)
+
+ (#Cons [x (#Cons [y xs])])
+ (return' (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "$'"]))
+ (#Cons [(_meta (#Form (#Cons [(_meta (#Tag ["lux" "AppT"]))
+ (#Cons [(_meta (#Tuple (#Cons [x (#Cons [y #Nil])])))
+ #Nil])])))
+ xs])])))
+ #Nil]))
+
+ _
+ (fail' "Wrong syntax for $'")))
+
+(def (id x)
+ (All' [a] (->' (B' a) (B' a)))
+ x)
+
+(def (fold' f init xs)
+ (All' [a b]
+ (->' (->' (B' a) (B' b) (B' a))
+ (B' a)
+ ($' List (B' b))
+ (B' a)))
+ (case' xs
+ #Nil
+ init
+
+ (#Cons [x xs'])
+ (fold' f (f init x) xs')))
+
+(def (reverse' list)
+ (->' ($' List Syntax) ($' List Syntax))
+ (fold' (check' (->' ($' List Syntax) Syntax
+ ($' List Syntax))
+ (lambda [tail head]
+ (#Cons [head tail])))
+ #Nil
+ list))
+
+(defmacro (list xs)
+ (return' (#Cons [(fold' (check' (->' Syntax Syntax Syntax)
+ (lambda [tail head]
+ (_meta (#Form (#Cons [(_meta (#Tag ["lux" "Cons"]))
+ (#Cons [(_meta (#Tuple (#Cons [head (#Cons [tail #Nil])])))
+ #Nil])])))))
+ (_meta (#Tag ["lux" "Nil"]))
+ (reverse' xs))
+ #Nil])))
+
+(defmacro (list& xs)
+ (case' (reverse' xs)
+ (#Cons [last init])
+ (return' (list (fold' (check' (->' Syntax Syntax Syntax)
+ (lambda [tail head]
+ (_meta (#Form (list (_meta (#Tag ["lux" "Cons"]))
+ (_meta (#Tuple (list head tail))))))))
+ last
+ init)))
+
+ _
+ (fail' "Wrong syntax for list&")))
+
+## (def (as-pairs xs)
+## (All [a]
+## (-> (List a) (List [a a])))
+## (case' xs
+## (#Cons [x (#Cons [y xs'])])
+## (#Cons [[x y] (as-pairs xs')])
+
+## _
+## #Nil))
+
+## (defmacro (let tokens state)
+## (case' tokens
+## (#Cons [(#Meta [_ (#Tuple bindings)]) (#Cons [body #Nil])])
+## (let' output (fold (lambda [body binding]
+## (case' binding
+## [label value]
+## (_meta (#Form (list (_meta (#Symbol ["lux" "let'"])) label value body)))))
+## body
+## (reverse (as-pairs bindings)))
+## (#Right [state (list output)]))))
+
+## (def (print x)
+## (-> (^ java.lang.Object) [])
+## (jvm-invokevirtual java.io.PrintStream "print" [java.lang.Object]
+## (jvm-getstatic java.lang.System "out") [x]))
+
+## (def (println x)
+## (-> (^ java.lang.Object) [])
+## (jvm-invokevirtual java.io.PrintStream "println" [java.lang.Object]
+## (jvm-getstatic java.lang.System "out") [x]))
+
+## (deftype (IO a)
+## (-> (,) a))
+
+## (defmacro (io tokens)
+## (case' tokens
+## (#Cons [value #Nil])
+## (return (list (` (lambda [_] (~ value)))))))
+
+## (def (. f g)
+## (All [a b c]
+## (-> (-> b c) (-> a b) (-> a c)))
+## (lambda [x] (f (g x))))
+
+## (def (++ xs ys)
+## (All [a]
+## (-> (List a) (List a) (List a)))
+## (case' xs
+## #Nil
+## ys
+
+## (#Cons [x xs'])
+## (#Cons [x (++ xs' ys)])))
+
+## (def concat
+## (All [a]
+## (-> (List (List a)) (List a)))
+## (fold ++ #Nil))
+
+## (def (map f xs)
+## (All [a b]
+## (-> (-> a b) (List a) (List b)))
+## (case' xs
+## #Nil
+## #Nil
+
+## (#Cons [x xs'])
+## (#Cons [(f x) (map f xs')])))
+
+## (def flat-map
+## (All [a b]
+## (-> (-> a (List b)) (List a) (List b)))
+## (. concat map))
+
+## (def (wrap-meta content)
+## ...
+## (_meta (#Form (list (_meta (#Tag ["lux" "Meta"]))
+## (_meta (#Tuple (list (_meta (#Tuple (list (_meta (#Form (list (_meta (#Tag ["lux" "Text"])) (_meta (#Text "")))))
+## (_meta (#Form (list (_meta (#Tag ["lux" "Int"])) (_meta (#Int -1)))))
+## (_meta (#Form (list (_meta (#Tag ["lux" "Int"])) (_meta (#Int -1))))))))
+## (_meta content))))))))
+
+## (def (untemplate-list tokens)
+## (-> (List Syntax) Syntax)
+## (case' tokens
+## #Nil
+## (_meta (#Tag ["lux" "Nil"]))
+
+## (#Cons [token tokens'])
+## (_meta (#Form (list (_meta (#Tag ["lux" "Cons"]))
+## (_meta (#Tuple (list token (untemplate-list tokens')))))))))
+
+## (def (untemplate token)
+## ...
+## (case' token
+## (#Meta [_ (#Bool value)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Bool"])) (_meta (#Bool value)))))
+
+## (#Meta [_ (#Int value)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Int"])) (_meta (#Int value)))))
+
+## (#Meta [_ (#Real value)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Real"])) (_meta (#Real value)))))
+
+## (#Meta [_ (#Char value)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Char"])) (_meta (#Char value)))))
+
+## (#Meta [_ (#Text value)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Text"])) (_meta (#Text value)))))
+
+## (#Meta [_ (#Tag [module name])])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Tag"])) (_meta (#Tuple (list (_meta (#Text module)) (_meta (#Text name))))))))
+
+## (#Meta [_ (#Symbol [module name])])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Symbol"])) (_meta (#Tuple (list (_meta (#Text module)) (_meta (#Text name))))))))
+
+## (#Meta [_ (#Tuple elems)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Tuple"])) (untemplate-list (map untemplate elems)))))
+
+## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol [_ "~"])]) (#Cons [(#Meta [_ unquoted]) #Nil])]))])
+## (_meta unquoted)
+
+## (#Meta [_ (#Form elems)])
+## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Form"])) (untemplate-list (map untemplate elems)))))
+## ))
+
+(defmacro (` tokens)
+ (case' tokens
+ (#Cons [template #Nil])
+ (return' (list (untemplate template)))))
+
+(defmacro (if tokens)
+ (case' tokens
+ (#Cons [test (#Cons [then (#Cons [else #Nil])])])
+ (return' (list (` (case' (~ test)
+ true (~ then)
+ false (~ else)))))))
+
+## (def (filter p xs)
+## (All [a]
+## (-> (-> a Bool) (List a) (List a)))
+## (case' xs
+## #Nil
+## #Nil
+
+## (#Cons [x xs'])
+## (if (p x)
+## (#Cons [x (filter p xs')])
+## (filter p xs'))))
+
+## (deftype (LuxStateM a)
+## (-> CompilerState (Either Text [CompilerState a])))
+
+## (def (return val)
+## (All [a]
+## (-> a (LuxStateM a)))
+## (lambda [state]
+## (#Right [state val])))
+
+## (def (fail msg)
+## (-> Text (LuxStateM Nothing))
+## (lambda [_]
+## (#Left msg)))
+
+## (def (bind f v)
+## (All [m a b] (-> (-> a (m b)) (m a) (m b)))
+## (lambda [state]
+## (case' (v state)
+## (#Right [state' x])
+## (f x state')
+
+## (#Left msg)
+## (#Left msg))))
+
+## (def (first pair)
+## (All [a b] (-> (, a b) a))
+## (case' pair
+## [f s]
+## f))
+
+## (def (second pair)
+## (All [a b] (-> (, a b) b))
+## (case' pair
+## [f s]
+## s))
+
+## (defmacro (loop tokens)
+## (case' tokens
+## (#Cons [bindings (#Cons [body #Nil])])
+## (let [pairs (as-pairs bindings)]
+## (return (list (#Form (#Cons [(` (lambda (~ (#Symbol ["lux" "recur"])) (~ (#Tuple (map first pairs)))
+## (~ body)))
+## (map second pairs)])))))))
+
+## (defmacro (export tokens)
+## (return (map (lambda [t] (` (export' (~ t))))
+## tokens)))
+
+## (defmacro (and tokens)
+## (let [as-if (case' tokens
+## #Nil
+## (` true)
+
+## (#Cons [init tests])
+## (fold (lambda [prev next]
+## (` (if (~ prev) (~ next) false)))
+## init
+## tokens)
+## )]
+## (return (list as-if))))
+
+## (defmacro (or tokens)
+## (let [as-if (case' tokens
+## #Nil
+## (` false)
+
+## (#Cons [init tests])
+## (fold (lambda [prev next]
+## (` (if (~ prev) true (~ next))))
+## init
+## tokens)
+## )]
+## (return (list as-if))))
+
+## (def (not x)
+## (-> Bool Bool)
+## (case' x
+## true false
+## false true))
+
+## (defmacro (|> tokens)
+## (case' tokens
+## (#Cons [init apps])
+## (return (list (fold (lambda [acc app]
+## (case' app
+## (#Form parts)
+## (#Form (++ parts (list acc)))
+
+## _
+## (` ((~ app) (~ acc)))))
+## init
+## apps)))))
+
+## (defmacro ($ tokens)
+## (case' tokens
+## (#Cons [op (#Cons [init args])])
+## (return (list (fold (lambda [acc elem]
+## (` ((~ op) (~ acc) (~ elem))))
+## init
+## args)))))
+
+## (def (const x)
+## (All [a]
+## (-> a (-> Any a)))
+## (lambda [_]
+## x))
+
+## (def (int> x y)
+## (-> Int Int Bool)
+## (jvm-lgt x y))
+
+## (def (int< x y)
+## (-> Int Int Bool)
+## (jvm-llt x y))
+
+## (def inc
+## (-> Int Int)
+## (int+ 1))
+
+## (def dec
+## (-> Int Int)
+## (int+ -1))
+
+## (def (repeat n x)
+## (All [a] (-> Int a (List a)))
+## (if (int> n 0)
+## (#Cons [x (repeat (dec n) x)])
+## #Nil))
+
+## (def size
+## (All [a]
+## (-> (List a) Int))
+## (fold (lambda [acc _] (inc acc)) 0))
+
+## (def (last xs)
+## (All [a]
+## (-> (List a) (Maybe a)))
+## (case' xs
+## #Nil #None
+## (#Cons [x #Nil]) (#Some x)
+## (#Cons [_ xs']) (last xs')))
+
+## (def (init xs)
+## (All [a]
+## (-> (List a) (Maybe (List a))))
+## (case' xs
+## #Nil #None
+## (#Cons [_ #Nil]) (#Some #Nil)
+## (#Cons [x xs']) (case' (init xs')
+## (#Some xs'')
+## (#Some (#Cons [x xs'']))
+
+## _
+## (#Some (#Cons [x #Nil])))))
+
+## (defmacro (cond tokens)
+## (case' (reverse tokens)
+## (#Cons [else branches'])
+## (return (list (fold (lambda [else branch]
+## (case' branch
+## [test then]
+## (` (if (~ test) (~ then) (~ else)))))
+## else
+## (|> branches' reverse as-pairs))))))
+
+## (def (interleave xs ys)
+## (All [a]
+## (-> (List a) (List a) (List a)))
+## (case' [xs ys]
+## [(#Cons [x xs']) (#Cons [y ys'])]
+## (list+ x y (interleave xs' ys'))
+
+## _
+## #Nil))
+
+## (def (interpose sep xs)
+## (All [a]
+## (-> a (List a) (List a)))
+## (case' xs
+## #Nil
+## xs
+
+## (#Cons [x #Nil])
+## xs
+
+## (#Cons [x xs'])
+## (list+ x sep (interpose sep xs'))))
+
+## (def (empty? xs)
+## (All [a]
+## (-> (List a) Bool))
+## (case' xs
+## #Nil true
+## _ false))
+
+## ## ## ## (do-template [<name> <op>]
+## ## ## ## (def (<name> p xs)
+## ## ## ## (case xs
+## ## ## ## #Nil true
+## ## ## ## (#Cons [x xs']) (<op> (p x) (<name> p xs'))))
+
+## ## ## ## [every? and]
+## ## ## ## [any? or])
+
+## (def (range from to)
+## (-> Int Int (List Int))
+## (if (int< from to)
+## (#Cons [from (range (inc from) to)])
+## #Nil))
+
+## (def (tuple->list tuple)
+## (-> Syntax (List Syntax))
+## (case' tuple
+## (#Meta [_ (#Tuple list)])
+## list))
+
+## (def (zip2 xs ys)
+## (All [a b]
+## (-> (List a) (List b) (List (, a b))))
+## (case' [xs ys]
+## [(#Cons [x xs']) (#Cons [y ys'])]
+## (#Cons [[x y] (zip2 xs' ys')])
+
+## _
+## #Nil))
+
+## (def (get key map)
+## (All [a b]
+## (-> a (List (, a b)) (Maybe b)))
+## (case' map
+## #Nil
+## #None
+
+## (#Cons [[k v] map'])
+## (if (jvm-invokevirtual java.lang.Object "equals" [java.lang.Object]
+## k [key])
+## (#Some v)
+## (get key map'))))
+
+## (def (get-ident x)
+## (-> Syntax Text)
+## (case' x
+## (#Meta [_ (#Symbol [_ ident])])
+## ident))
+
+## (def (text-++ x y)
+## (-> Text Text Text)
+## (jvm-invokevirtual java.lang.String "concat" [java.lang.String]
+## x [y]))
+
+## (def (show-env env)
+## ...
+## (|> env (map first) (interpose ", ") (fold text-++ "")))
+
+## (def (apply-template env template)
+## (case' template
+## (#Meta [_ (#Symbol [_ ident])])
+## (case' (get ident env)
+## (#Some subst)
+## subst
+
+## _
+## template)
+
+## (#Meta [_ (#Tuple elems)])
+## (_meta (#Tuple (map (apply-template env) elems)))
+
+## (#Meta [_ (#Form elems)])
+## (_meta (#Form (map (apply-template env) elems)))
+
+## (#Meta [_ (#Record members)])
+## (_meta (#Record (map (lambda [kv]
+## (case' kv
+## [slot value]
+## [(apply-template env slot) (apply-template env value)]))
+## members)))
+
+## _
+## template))
+
+## (defmacro (do-templates tokens)
+## (case' tokens
+## (#Cons [bindings (#Cons [(#Meta [_ (#Tuple templates)]) data])])
+## (let [bindings-list (map get-ident (tuple->list bindings))
+## data-lists (map tuple->list data)
+## apply (lambda [env] (map (apply-template env) templates))]
+## (|> data-lists
+## (map (. apply (zip2 bindings-list)))
+## return))))
+
+## ## ## ## (do-template [<name> <offset>]
+## ## ## ## (def <name> (int+ <offset>))
+
+## ## ## ## [inc 1]
+## ## ## ## [dec -1])
+
+## (def (int= x y)
+## (-> Int Int Bool)
+## (jvm-leq x y))
+
+## (def (int% x y)
+## (-> Int Int Int)
+## (jvm-lrem x y))
+
+## (def (int>= x y)
+## (-> Int Int Bool)
+## (or (int= x y)
+## (int> x y)))
+
+## (do-templates [<name> <cmp>]
+## [(def (<name> x y)
+## (-> Int Int Int)
+## (if (<cmp> x y)
+## x
+## y))]
+
+## [max int>]
+## [min int<])
+
+## (do-templates [<name> <cmp>]
+## [(def (<name> n)
+## (-> Int Bool)
+## (<cmp> n 0))]
+
+## [neg? int<]
+## [pos? int>=])
+
+## (def (even? n)
+## (-> Int Bool)
+## (int= 0 (int% n 0)))
+
+## (def (odd? n)
+## (-> Int Bool)
+## (not (even? n)))
+
+## (do-templates [<name> <done> <step>]
+## [(def (<name> n xs)
+## (All [a]
+## (-> Int (List a) (List a)))
+## (if (int> n 0)
+## (case' xs
+## #Nil #Nil
+## (#Cons [x xs']) <step>)
+## <done>))]
+
+## [take #Nil (list+ x (take (dec n) xs'))]
+## [drop xs (drop (dec n) xs')])
+
+## (do-templates [<name> <done> <step>]
+## [(def (<name> f xs)
+## (All [a]
+## (-> (-> a Bool) (List a) (List a)))
+## (case' xs
+## #Nil #Nil
+## (#Cons [x xs']) (if (f x) <step> #Nil)))]
+
+## [take-while #Nil (list+ x (take-while f xs'))]
+## [drop-while xs (drop-while f xs')])
+
+## ## (defmacro (get@ tokens)
+## ## (let [output (case' tokens
+## ## (#Cons [tag (#Cons [record #Nil])])
+## ## (` (get@' (~ tag) (~ record)))
+
+## ## (#Cons [tag #Nil])
+## ## (` (lambda [record] (get@' (~ tag) record))))]
+## ## (return (list output))))
+
+## ## (defmacro (set@ tokens)
+## ## (let [output (case' tokens
+## ## (#Cons [tag (#Cons [value (#Cons [record #Nil])])])
+## ## (` (set@' (~ tag) (~ value) (~ record)))
+
+## ## (#Cons [tag (#Cons [value #Nil])])
+## ## (` (lambda [record] (set@' (~ tag) (~ value) record)))
+
+## ## (#Cons [tag #Nil])
+## ## (` (lambda [value record] (set@' (~ tag) value record))))]
+## ## (return (list output))))
+
+## ## (defmacro (update@ tokens)
+## ## (let [output (case' tokens
+## ## (#Cons [tag (#Cons [func (#Cons [record #Nil])])])
+## ## (` (let [_record_ (~ record)]
+## ## (set@' (~ tag) ((~ func) (get@' (~ tag) _record_)) _record_)))
+
+## ## (#Cons [tag (#Cons [func #Nil])])
+## ## (` (lambda [record]
+## ## (` (set@' (~ tag) ((~ func) (get@' (~ tag) record)) record))))
+
+## ## (#Cons [tag #Nil])
+## ## (` (lambda [func record]
+## ## (set@' (~ tag) (func (get@' (~ tag) record)) record))))]
+## ## (return (list output))))
+
+## (def (show-int int)
+## (-> Int Text)
+## (jvm-invokevirtual java.lang.Object "toString" []
+## int []))
+
+## (def gensym
+## (LuxStateM Syntax)
+## (lambda [state]
+## [(update@ [#gen-seed] inc state)
+## (_meta (#Symbol ($ text-++ "__" (show-int (get@ [#gen-seed] state)) "__")))]))
+
+## ## (do-template [<name> <member>]
+## ## (def (<name> pair)
+## ## (case' pair
+## ## [f s]
+## ## <member>))
+
+## ## [first f]
+## ## [second s])
+
+## (def (show-syntax syntax)
+## (-> Syntax Text)
+## (case' syntax
+## (#Meta [_ (#Bool value)])
+## (jvm-invokevirtual java.lang.Object "toString" []
+## value [])
+
+## (#Meta [_ (#Int value)])
+## (jvm-invokevirtual java.lang.Object "toString" []
+## value [])
+
+## (#Meta [_ (#Real value)])
+## (jvm-invokevirtual java.lang.Object "toString" []
+## value [])
+
+## (#Meta [_ (#Char value)])
+## (jvm-invokevirtual java.lang.Object "toString" []
+## value [])
+
+## (#Meta [_ (#Text value)])
+## (jvm-invokevirtual java.lang.Object "toString" []
+## value [])
+
+## (#Meta [_ (#Symbol [module name])])
+## ($ text-++ module ";" name)
+
+## (#Meta [_ (#Tag [module name])])
+## ($ text-++ "#" module ";" name)
+
+## (#Meta [_ (#Tuple members)])
+## ($ text-++ "[" (fold text-++ "" (interpose " " (map show-syntax members))) "]")
+
+## (#Meta [_ (#Form members)])
+## ($ text-++ "(" (fold text-++ "" (interpose " " (map show-syntax members))) ")")
+## ))
+
+## (defmacro (do tokens)
+## (case' tokens
+## (#Cons [(#Meta [_ monad]) (#Cons [(#Meta [_ (#Tuple bindings)]) (#Cons [body #Nil])])])
+## (let [output (fold (lambda [body binding]
+## (case' binding
+## [lhs rhs]
+## (` (lux;bind (lambda [(~ lhs)] (~ body))
+## (~ rhs)))))
+## body
+## (reverse (as-pairs bindings)))]
+## (return (list (` (using (~ monad) (~ output))))))))
+
+## (def (map% f xs)
+## (All [m a b]
+## (-> (-> a (m b)) (List a) (m (List b))))
+## (case' xs
+## #Nil
+## (return xs)
+
+## (#Cons [x xs'])
+## (do [y (f x)
+## ys (map% f xs')]
+## (return (#Cons [y ys])))))
+
+## ## (defmacro ($keys tokens)
+## ## (case' tokens
+## ## (#Cons [(#Meta [_ (#Tuple fields)]) #Nil])
+## ## (return (list (_meta (#Record (map (lambda [slot]
+## ## (case' slot
+## ## (#Meta [_ (#Tag [module name])])
+## ## [($ text-++ module ";" name) (_meta (#Symbol [module name]))]))
+## ## fields)))))))
+
+## ## (defmacro ($or tokens)
+## ## (case' tokens
+## ## (#Cons [(#Meta [_ (#Tuple patterns)]) (#Cons [body #Nil])])
+## ## (return (flat-map (lambda [pattern] (list pattern body))
+## ## patterns))))
+
+## ## (def null jvm-null)
+
+## (defmacro (^ tokens)
+## (case' tokens
+## (#Cons [(#Meta [_ (#Symbol [_ class-name])]) #Nil])
+## (return (list (` (#DataT (~ (_meta (#Text class-name)))))))
+## ))
+
+## (defmacro (, members)
+## (return (list (_meta (#Form (list+ (_meta (#Tag ["lux" "TupleT"])) (untemplate-list members)))))))
+
+## (defmacro (| members)
+## (let [members' (map (lambda [m]
+## (case' m
+## (#Meta [_ (#Tag [module name])])
+## [($ text-++ module ";" name) (` (#Tuple (list)))]
+
+## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Tag [module name])]) (#Cons [value #Nil])]))])
+## [($ text-++ module ";" name) (` (#Tuple (~ value)))]))
+## members)]
+## (return (list (_meta (#Form (list+ (_meta (#Tag ["lux" "VariantT"])) (untemplate-list members))))))))
+
+## (defmacro (& members)
+## (let [members' (map (lambda [m]
+## (case' m
+## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Tag [module name])]) (#Cons [value #Nil])]))])
+## [($ text-++ module ";" name) (` (#Tuple (~ value)))]))
+## members)]
+## (return (list (_meta (#Form (list+ (_meta (#Tag ["lux" "RecordT"])) (untemplate-list members))))))))
+
+## (defmacro (-> tokens)
+## (case' (reverse tokens)
+## (#Cons [f-return f-args])
+## (fold (lambda [f-return f-arg]
+## (` (#LambdaT [(~ f-arg) (~ f-return)])))
+## f-return
+## f-args)))
+
+## (def (text= x y)
+## (-> Text Text Bool)
+## (jvm-invokevirtual java.lang.Object "equals" [java.lang.Object]
+## x [y]))
+
+## (def (replace-ident ident value syntax)
+## (-> (, Text Text) Syntax Syntax Syntax)
+## (let [[module name] ident]
+## (case' syntax
+## (#Meta [_ (#Symbol [?module ?name])])
+## (if (and (text= module ?module)
+## (text= name ?name))
+## value
+## syntax)
+
+## (#Meta [_ (#Form members)])
+## (_meta (#Form (map (replace-ident ident value) members)))
+
+## (#Meta [_ (#Tuple members)])
+## (_meta (#Tuple (map (replace-ident ident value) members)))
+
+## (#Meta [_ (#Record members)])
+## (_meta (#Record (map (lambda [kv]
+## (case' kv
+## [k v]
+## [k (replace-ident ident value v)]))
+## members)))
+
+## _
+## syntax)))
+
+## (defmacro (All tokens)
+## (let [[name args body] (case' tokens
+## (#Cons [(#Meta [_ (#Symbol [_ name])]) (#Cons [(#Meta [_ (#Tuple args)]) (#Cons [body #Nil])])])
+## [name args body]
+
+## (#Cons [(#Meta [_ (#Tuple args)]) (#Cons [body #Nil])])
+## ["" args body])
+## rolled (fold (lambda [body arg]
+## (case' arg
+## (#Meta [_ (#Symbol [arg-module arg-name])])
+## (` (#AllT (list) "" (~ (_meta (#Text arg-name))) (~ (replace-ident [arg-module arg-name]
+## (` (#BoundT (~ (#Text arg-name))))
+## body))))))
+## body
+## args)]
+## (case' rolled
+## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Tag ["lux" "AllT"])]) (#Cons [env (#Cons [(#Meta [_ (#Text "")]) (#Cons [(#Meta [_ (#Text arg-name)]) (#Cons [body #Nil])])])])]))])
+## (return (list (` (#AllT (~ env) (~ (#Text name)) (~ (#Text arg-name))
+## (~ (replace-ident arg-name (` (#BoundT (~ (#Text name))))
+## body)))))))))
+
+## (defmacro (Exists tokens)
+## (case' tokens
+## (#Cons [args (#Cons [body #Nil])])
+## (return (list (` (All (~ args) (~ body)))))))
+
+## (def Any #AnyT)
+## (def Nothing #NothingT)
+## (def Bool (^ java.lang.Boolean))
+## (def Int (^ java.lang.Long))
+## (def Real (^ java.lang.Double))
+## (def Char (^ java.lang.Character))
+## (def Text (^ java.lang.String))
-## (def' let'
-## (lambda' _ tokens
-## (lambda' _ state
-## (case' tokens
-## (#Cons [lhs (#Cons [rhs (#Cons [body #Nil])])])
-## (#Right [state
-## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "case'"]))
-## (#Cons [rhs (#Cons [lhs (#Cons [body #Nil])])])])))
-## #Nil])])
-
-## _
-## (#Left "Wrong syntax for let'"))
-## )))
-## (declare-macro' let')
-
-## ## ## (def' lambda
-## ## ## (check' Macro
-## ## ## (lambda' _ tokens
-## ## ## (lambda' _ state
-## ## ## (let' output (case' tokens
-## ## ## (#Cons [(#Meta [_ (#Tuple (#Cons [arg args']))]) (#Cons [body #Nil])])
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["" "lambda'"]))
-## ## ## (#Cons [(_meta (#Symbol ["" ""]))
-## ## ## (#Cons [arg
-## ## ## (#Cons [(case' args'
-## ## ## #Nil
-## ## ## body
-
-## ## ## _
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
-## ## ## (#Cons [(_meta (#Tuple args'))
-## ## ## (#Cons [body #Nil])])]))))
-## ## ## #Nil])])])])))
-
-## ## ## (#Cons [(#Meta [_ (#Symbol self)]) (#Cons [(#Meta [_ (#Tuple (#Cons [arg args']))]) (#Cons [body #Nil])])])
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["" "lambda'"]))
-## ## ## (#Cons [(_meta (#Symbol self))
-## ## ## (#Cons [arg
-## ## ## (#Cons [(case' args'
-## ## ## #Nil
-## ## ## body
-
-## ## ## _
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
-## ## ## (#Cons [(_meta (#Tuple args'))
-## ## ## (#Cons [body #Nil])])]))))
-## ## ## #Nil])])])]))))
-## ## ## (#Right [state (#Cons [output #Nil])]))
-## ## ## ))))
-## ## ## (declare-macro lambda)
-
-## ## ## (def' def
-## ## ## (check' Macro
-## ## ## (lambda [tokens state]
-## ## ## (let' output (case' tokens
-## ## ## (#Cons [(#Meta [_ (#Symbol name)]) (#Cons [body #Nil])])
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"])) tokens])))
-
-## ## ## (#Cons [(#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol name)]) args]))])
-## ## ## (#Cons [body #Nil])])
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"]))
-## ## ## (#Cons [(_meta (#Symbol name))
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
-## ## ## (#Cons [(_meta (#Symbol name))
-## ## ## (#Cons [(_meta (#Tuple args))
-## ## ## (#Cons [body #Nil])])])])))
-## ## ## #Nil])])])))
-
-## ## ## (#Cons [(#Meta [_ (#Symbol name)]) (#Cons [type (#Cons [body #Nil])])])
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"]))
-## ## ## (#Cons [(_meta (#Symbol name))
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "check'"]))
-## ## ## (#Cons [type
-## ## ## (#Cons [body
-## ## ## #Nil])])])))
-## ## ## #Nil])])])))
-
-## ## ## (#Cons [(#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol name)]) args]))])
-## ## ## (#Cons [type (#Cons [body #Nil])])])
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["" "def'"]))
-## ## ## (#Cons [(_meta (#Symbol name))
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "check'"]))
-## ## ## (#Cons [type
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
-## ## ## (#Cons [(_meta (#Symbol name))
-## ## ## (#Cons [(_meta (#Tuple args))
-## ## ## (#Cons [body #Nil])])])])))
-## ## ## #Nil])])])))
-## ## ## #Nil])])]))))
-## ## ## (#Right [state (#Cons [output #Nil])])))))
-## ## ## (declare-macro def)
-
-## ## ## (def (defmacro tokens state)
-## ## ## (let' [fn-name fn-def] (case' tokens
-## ## ## (#Cons [(#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol fn-name)]) args]))])
-## ## ## (#Cons [body #Nil])])
-## ## ## [fn-name
-## ## ## (_meta (#Form (#Cons [(_meta (#Symbol ["lux" "def"]))
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol fn-name)) args])))
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["" "check'"]))
-## ## ## (#Cons [(_meta (#Symbol ["lux;" "Macro"]))
-## ## ## (#Cons [(_meta (#Form (#Cons [(_meta (#Symbol ["lux" "lambda"]))
-## ## ## (#Cons [(_meta (#Symbol name))
-## ## ## (#Cons [(_meta (#Tuple args))
-## ## ## (#Cons [body #Nil])])])])))
-## ## ## #Nil])])])))
-## ## ## #Nil])])])))])
-## ## ## (let' declaration (_meta (#Form (#Cons [(_meta (#Symbol ["" "declare-macro"])) (#Cons [(_meta (#Symbol fn-name)) #Nil])])))
-## ## ## (#Right [state (#Cons [fn-def (#Cons [declaration #Nil])])]))))
-## ## ## (declare-macro defmacro)
-
-## ## ## (defmacro (comment tokens state)
-## ## ## (#Right [state #Nil]))
-
-## ## ## (def (int+ x y)
-## ## ## (-> Int Int Int)
-## ## ## (jvm-ladd x y))
-
-## ## ## (def (id x)
-## ## ## (All [a] (-> a a))
-## ## ## x)
-
-## ## ## (def (print x)
-## ## ## (-> (^ java.lang.Object) [])
-## ## ## (jvm-invokevirtual java.io.PrintStream "print" [java.lang.Object]
-## ## ## (jvm-getstatic java.lang.System "out") [x]))
-
-## ## ## (def (println x)
-## ## ## (-> (^ java.lang.Object) [])
-## ## ## (jvm-invokevirtual java.io.PrintStream "println" [java.lang.Object]
-## ## ## (jvm-getstatic java.lang.System "out") [x]))
-
-## ## ## (deftype (IO a)
-## ## ## (-> (,) a))
-
-## ## ## (defmacro (io tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [value #Nil])
-## ## ## (return (list (` (lambda [_] (~ value)))))))
-
-## ## ## (def (fold f init xs)
-## ## ## (All [a b]
-## ## ## (-> (-> a b a) a (List b) a))
-## ## ## (case' xs
-## ## ## #Nil
-## ## ## init
-
-## ## ## (#Cons [x xs'])
-## ## ## (fold f (f init x) xs')))
-
-## ## ## (def (reverse list)
-## ## ## (All [a]
-## ## ## (-> (List a) (List a)))
-## ## ## (fold (lambda [tail head]
-## ## ## (#Cons [head tail]))
-## ## ## #Nil
-## ## ## list))
-
-## ## ## (defmacro (list xs state)
-## ## ## (let' xs' (reverse xs)
-## ## ## (let' output (fold (lambda [tail head]
-## ## ## (_meta (#Form (#Cons [(_meta (#Tag ["lux" "Cons"]))
-## ## ## (#Cons [(_meta (#Tuple (#Cons [head (#Cons [tail #Nil])])))
-## ## ## #Nil])]))))
-## ## ## (_meta (#Tag ["lux" "Nil"]))
-## ## ## xs')
-## ## ## (#Right [state (#Cons [output #Nil])]))))
-
-## ## ## (defmacro (list+ xs state)
-## ## ## (case' (reverse xs)
-## ## ## #Nil
-## ## ## [#Nil state]
-
-## ## ## (#Cons [last init'])
-## ## ## (let' output (fold (lambda [tail head]
-## ## ## (_meta (#Form (list (_meta (#Tag ["lux" "Cons"])) (_meta (#Tuple (list head tail)))))))
-## ## ## last
-## ## ## init')
-## ## ## (#Right [state (#Cons [output #Nil])]))))
-
-## ## ## (def (as-pairs xs)
-## ## ## (All [a]
-## ## ## (-> (List a) (List [a a])))
-## ## ## (case' xs
-## ## ## (#Cons [x (#Cons [y xs'])])
-## ## ## (#Cons [[x y] (as-pairs xs')])
-
-## ## ## _
-## ## ## #Nil))
-
-## ## ## (defmacro (let tokens state)
-## ## ## (case' tokens
-## ## ## (#Cons [(#Meta [_ (#Tuple bindings)]) (#Cons [body #Nil])])
-## ## ## (let' output (fold (lambda [body binding]
-## ## ## (case' binding
-## ## ## [label value]
-## ## ## (_meta (#Form (list (_meta (#Symbol ["lux" "let'"])) label value body)))))
-## ## ## body
-## ## ## (reverse (as-pairs bindings)))
-## ## ## (#Right [state (list output)]))))
-
-## ## ## (def (. f g)
-## ## ## (All [a b c]
-## ## ## (-> (-> b c) (-> a b) (-> a c)))
-## ## ## (lambda [x] (f (g x))))
-
-## ## ## (def (++ xs ys)
-## ## ## (All [a]
-## ## ## (-> (List a) (List a) (List a)))
-## ## ## (case' xs
-## ## ## #Nil
-## ## ## ys
-
-## ## ## (#Cons [x xs'])
-## ## ## (#Cons [x (++ xs' ys)])))
-
-## ## ## (def concat
-## ## ## (All [a]
-## ## ## (-> (List (List a)) (List a)))
-## ## ## (fold ++ #Nil))
-
-## ## ## (def (map f xs)
-## ## ## (All [a b]
-## ## ## (-> (-> a b) (List a) (List b)))
-## ## ## (case' xs
-## ## ## #Nil
-## ## ## #Nil
-
-## ## ## (#Cons [x xs'])
-## ## ## (#Cons [(f x) (map f xs')])))
-
-## ## ## (def flat-map
-## ## ## (All [a b]
-## ## ## (-> (-> a (List b)) (List a) (List b)))
-## ## ## (. concat map))
-
-## ## ## (def (wrap-meta content)
-## ## ## ...
-## ## ## (_meta (#Form (list (_meta (#Tag ["lux" "Meta"]))
-## ## ## (_meta (#Tuple (list (_meta (#Tuple (list (_meta (#Form (list (_meta (#Tag ["lux" "Text"])) (_meta (#Text "")))))
-## ## ## (_meta (#Form (list (_meta (#Tag ["lux" "Int"])) (_meta (#Int -1)))))
-## ## ## (_meta (#Form (list (_meta (#Tag ["lux" "Int"])) (_meta (#Int -1))))))))
-## ## ## (_meta content))))))))
-
-## ## ## (def (untemplate-list tokens)
-## ## ## (-> (List Syntax) Syntax)
-## ## ## (case' tokens
-## ## ## #Nil
-## ## ## (_meta (#Tag ["lux" "Nil"]))
-
-## ## ## (#Cons [token tokens'])
-## ## ## (_meta (#Form (list (_meta (#Tag ["lux" "Cons"]))
-## ## ## (_meta (#Tuple (list token (untemplate-list tokens')))))))))
-
-## ## ## (def (untemplate token)
-## ## ## ...
-## ## ## (case' token
-## ## ## (#Meta [_ (#Bool value)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Bool"])) (_meta (#Bool value)))))
-
-## ## ## (#Meta [_ (#Int value)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Int"])) (_meta (#Int value)))))
-
-## ## ## (#Meta [_ (#Real value)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Real"])) (_meta (#Real value)))))
-
-## ## ## (#Meta [_ (#Char value)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Char"])) (_meta (#Char value)))))
-
-## ## ## (#Meta [_ (#Text value)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Text"])) (_meta (#Text value)))))
-
-## ## ## (#Meta [_ (#Tag [module name])])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Tag"])) (_meta (#Tuple (list (_meta (#Text module)) (_meta (#Text name))))))))
-
-## ## ## (#Meta [_ (#Symbol [module name])])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Symbol"])) (_meta (#Tuple (list (_meta (#Text module)) (_meta (#Text name))))))))
-
-## ## ## (#Meta [_ (#Tuple elems)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Tuple"])) (untemplate-list (map untemplate elems)))))
-
-## ## ## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Symbol [_ "~"])]) (#Cons [(#Meta [_ unquoted]) #Nil])]))])
-## ## ## (_meta unquoted)
-
-## ## ## (#Meta [_ (#Form elems)])
-## ## ## (wrap-meta (#Form (list (_meta (#Tag ["lux" "Form"])) (untemplate-list (map untemplate elems)))))
-## ## ## ))
-
-## ## ## (defmacro (` tokens state)
-## ## ## (case' tokens
-## ## ## (#Cons [template #Nil])
-## ## ## (#Right [state (list (untemplate template))])))
-
-## ## ## (defmacro (if tokens state)
-## ## ## (case' tokens
-## ## ## (#Cons [test (#Cons [then (#Cons [else #Nil])])])
-## ## ## (#Right [state
-## ## ## (list (` (case' (~ test)
-## ## ## true (~ then)
-## ## ## false (~ else))))])))
-
-## ## ## (def (filter p xs)
-## ## ## (All [a]
-## ## ## (-> (-> a Bool) (List a) (List a)))
-## ## ## (case' xs
-## ## ## #Nil
-## ## ## #Nil
-
-## ## ## (#Cons [x xs'])
-## ## ## (if (p x)
-## ## ## (#Cons [x (filter p xs')])
-## ## ## (filter p xs'))))
-
-## ## ## (deftype (LuxStateM a)
-## ## ## (-> CompilerState (Either Text [CompilerState a])))
-
-## ## ## (def (return val)
-## ## ## (All [a]
-## ## ## (-> a (LuxStateM a)))
-## ## ## (lambda [state]
-## ## ## (#Right [state val])))
-
-## ## ## (def (fail msg)
-## ## ## (-> Text (LuxStateM Nothing))
-## ## ## (lambda [_]
-## ## ## (#Left msg)))
-
-## ## ## (def (bind f v)
-## ## ## (All [m a b] (-> (-> a (m b)) (m a) (m b)))
-## ## ## (lambda [state]
-## ## ## (case' (v state)
-## ## ## (#Right [state' x])
-## ## ## (f x state')
-
-## ## ## (#Left msg)
-## ## ## (#Left msg))))
-
-## ## ## (def (first pair)
-## ## ## (All [a b] (-> (, a b) a))
-## ## ## (case' pair
-## ## ## [f s]
-## ## ## f))
-
-## ## ## (def (second pair)
-## ## ## (All [a b] (-> (, a b) b))
-## ## ## (case' pair
-## ## ## [f s]
-## ## ## s))
-
-## ## ## (defmacro (loop tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [bindings (#Cons [body #Nil])])
-## ## ## (let [pairs (as-pairs bindings)]
-## ## ## (return (list (#Form (#Cons [(` (lambda (~ (#Symbol ["lux" "recur"])) (~ (#Tuple (map first pairs)))
-## ## ## (~ body)))
-## ## ## (map second pairs)])))))))
-
-## ## ## (defmacro (export tokens)
-## ## ## (return (map (lambda [t] (` (export' (~ t))))
-## ## ## tokens)))
-
-## ## ## (defmacro (and tokens)
-## ## ## (let [as-if (case' tokens
-## ## ## #Nil
-## ## ## (` true)
-
-## ## ## (#Cons [init tests])
-## ## ## (fold (lambda [prev next]
-## ## ## (` (if (~ prev) (~ next) false)))
-## ## ## init
-## ## ## tokens)
-## ## ## )]
-## ## ## (return (list as-if))))
-
-## ## ## (defmacro (or tokens)
-## ## ## (let [as-if (case' tokens
-## ## ## #Nil
-## ## ## (` false)
-
-## ## ## (#Cons [init tests])
-## ## ## (fold (lambda [prev next]
-## ## ## (` (if (~ prev) true (~ next))))
-## ## ## init
-## ## ## tokens)
-## ## ## )]
-## ## ## (return (list as-if))))
-
-## ## ## (def (not x)
-## ## ## (-> Bool Bool)
-## ## ## (case' x
-## ## ## true false
-## ## ## false true))
-
-## ## ## (defmacro (|> tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [init apps])
-## ## ## (return (list (fold (lambda [acc app]
-## ## ## (case' app
-## ## ## (#Form parts)
-## ## ## (#Form (++ parts (list acc)))
-
-## ## ## _
-## ## ## (` ((~ app) (~ acc)))))
-## ## ## init
-## ## ## apps)))))
-
-## ## ## (defmacro ($ tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [op (#Cons [init args])])
-## ## ## (return (list (fold (lambda [acc elem]
-## ## ## (` ((~ op) (~ acc) (~ elem))))
-## ## ## init
-## ## ## args)))))
-
-## ## ## (def (const x)
-## ## ## (All [a]
-## ## ## (-> a (-> Any a)))
-## ## ## (lambda [_]
-## ## ## x))
-
-## ## ## (def (int> x y)
-## ## ## (-> Int Int Bool)
-## ## ## (jvm-lgt x y))
-
-## ## ## (def (int< x y)
-## ## ## (-> Int Int Bool)
-## ## ## (jvm-llt x y))
-
-## ## ## (def inc
-## ## ## (-> Int Int)
-## ## ## (int+ 1))
-
-## ## ## (def dec
-## ## ## (-> Int Int)
-## ## ## (int+ -1))
-
-## ## ## (def (repeat n x)
-## ## ## (All [a] (-> Int a (List a)))
-## ## ## (if (int> n 0)
-## ## ## (#Cons [x (repeat (dec n) x)])
-## ## ## #Nil))
-
-## ## ## (def size
-## ## ## (All [a]
-## ## ## (-> (List a) Int))
-## ## ## (fold (lambda [acc _] (inc acc)) 0))
-
-## ## ## (def (last xs)
-## ## ## (All [a]
-## ## ## (-> (List a) (Maybe a)))
-## ## ## (case' xs
-## ## ## #Nil #None
-## ## ## (#Cons [x #Nil]) (#Some x)
-## ## ## (#Cons [_ xs']) (last xs')))
-
-## ## ## (def (init xs)
-## ## ## (All [a]
-## ## ## (-> (List a) (Maybe (List a))))
-## ## ## (case' xs
-## ## ## #Nil #None
-## ## ## (#Cons [_ #Nil]) (#Some #Nil)
-## ## ## (#Cons [x xs']) (case' (init xs')
-## ## ## (#Some xs'')
-## ## ## (#Some (#Cons [x xs'']))
-
-## ## ## _
-## ## ## (#Some (#Cons [x #Nil])))))
-
-## ## ## (defmacro (cond tokens)
-## ## ## (case' (reverse tokens)
-## ## ## (#Cons [else branches'])
-## ## ## (return (list (fold (lambda [else branch]
-## ## ## (case' branch
-## ## ## [test then]
-## ## ## (` (if (~ test) (~ then) (~ else)))))
-## ## ## else
-## ## ## (|> branches' reverse as-pairs))))))
-
-## ## ## (def (interleave xs ys)
-## ## ## (All [a]
-## ## ## (-> (List a) (List a) (List a)))
-## ## ## (case' [xs ys]
-## ## ## [(#Cons [x xs']) (#Cons [y ys'])]
-## ## ## (list+ x y (interleave xs' ys'))
-
-## ## ## _
-## ## ## #Nil))
-
-## ## ## (def (interpose sep xs)
-## ## ## (All [a]
-## ## ## (-> a (List a) (List a)))
-## ## ## (case' xs
-## ## ## #Nil
-## ## ## xs
-
-## ## ## (#Cons [x #Nil])
-## ## ## xs
-
-## ## ## (#Cons [x xs'])
-## ## ## (list+ x sep (interpose sep xs'))))
-
-## ## ## (def (empty? xs)
-## ## ## (All [a]
-## ## ## (-> (List a) Bool))
-## ## ## (case' xs
-## ## ## #Nil true
-## ## ## _ false))
-
-## ## ## ## ## ## (do-template [<name> <op>]
-## ## ## ## ## ## (def (<name> p xs)
-## ## ## ## ## ## (case xs
-## ## ## ## ## ## #Nil true
-## ## ## ## ## ## (#Cons [x xs']) (<op> (p x) (<name> p xs'))))
-
-## ## ## ## ## ## [every? and]
-## ## ## ## ## ## [any? or])
-
-## ## ## (def (range from to)
-## ## ## (-> Int Int (List Int))
-## ## ## (if (int< from to)
-## ## ## (#Cons [from (range (inc from) to)])
-## ## ## #Nil))
-
-## ## ## (def (tuple->list tuple)
-## ## ## (-> Syntax (List Syntax))
-## ## ## (case' tuple
-## ## ## (#Meta [_ (#Tuple list)])
-## ## ## list))
-
-## ## ## (def (zip2 xs ys)
-## ## ## (All [a b]
-## ## ## (-> (List a) (List b) (List (, a b))))
-## ## ## (case' [xs ys]
-## ## ## [(#Cons [x xs']) (#Cons [y ys'])]
-## ## ## (#Cons [[x y] (zip2 xs' ys')])
-
-## ## ## _
-## ## ## #Nil))
-
-## ## ## (def (get key map)
-## ## ## (All [a b]
-## ## ## (-> a (List (, a b)) (Maybe b)))
-## ## ## (case' map
-## ## ## #Nil
-## ## ## #None
-
-## ## ## (#Cons [[k v] map'])
-## ## ## (if (jvm-invokevirtual java.lang.Object "equals" [java.lang.Object]
-## ## ## k [key])
-## ## ## (#Some v)
-## ## ## (get key map'))))
-
-## ## ## (def (get-ident x)
-## ## ## (-> Syntax Text)
-## ## ## (case' x
-## ## ## (#Meta [_ (#Symbol [_ ident])])
-## ## ## ident))
-
-## ## ## (def (text-++ x y)
-## ## ## (-> Text Text Text)
-## ## ## (jvm-invokevirtual java.lang.String "concat" [java.lang.String]
-## ## ## x [y]))
-
-## ## ## (def (show-env env)
-## ## ## ...
-## ## ## (|> env (map first) (interpose ", ") (fold text-++ "")))
-
-## ## ## (def (apply-template env template)
-## ## ## (case' template
-## ## ## (#Meta [_ (#Symbol [_ ident])])
-## ## ## (case' (get ident env)
-## ## ## (#Some subst)
-## ## ## subst
-
-## ## ## _
-## ## ## template)
-
-## ## ## (#Meta [_ (#Tuple elems)])
-## ## ## (_meta (#Tuple (map (apply-template env) elems)))
-
-## ## ## (#Meta [_ (#Form elems)])
-## ## ## (_meta (#Form (map (apply-template env) elems)))
-
-## ## ## (#Meta [_ (#Record members)])
-## ## ## (_meta (#Record (map (lambda [kv]
-## ## ## (case' kv
-## ## ## [slot value]
-## ## ## [(apply-template env slot) (apply-template env value)]))
-## ## ## members)))
-
-## ## ## _
-## ## ## template))
-
-## ## ## (defmacro (do-templates tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [bindings (#Cons [(#Meta [_ (#Tuple templates)]) data])])
-## ## ## (let [bindings-list (map get-ident (tuple->list bindings))
-## ## ## data-lists (map tuple->list data)
-## ## ## apply (lambda [env] (map (apply-template env) templates))]
-## ## ## (|> data-lists
-## ## ## (map (. apply (zip2 bindings-list)))
-## ## ## return))))
-
-## ## ## ## ## ## (do-template [<name> <offset>]
-## ## ## ## ## ## (def <name> (int+ <offset>))
-
-## ## ## ## ## ## [inc 1]
-## ## ## ## ## ## [dec -1])
-
-## ## ## (def (int= x y)
-## ## ## (-> Int Int Bool)
-## ## ## (jvm-leq x y))
-
-## ## ## (def (int% x y)
-## ## ## (-> Int Int Int)
-## ## ## (jvm-lrem x y))
-
-## ## ## (def (int>= x y)
-## ## ## (-> Int Int Bool)
-## ## ## (or (int= x y)
-## ## ## (int> x y)))
-
-## ## ## (do-templates [<name> <cmp>]
-## ## ## [(def (<name> x y)
-## ## ## (-> Int Int Int)
-## ## ## (if (<cmp> x y)
-## ## ## x
-## ## ## y))]
-
-## ## ## [max int>]
-## ## ## [min int<])
-
-## ## ## (do-templates [<name> <cmp>]
-## ## ## [(def (<name> n)
-## ## ## (-> Int Bool)
-## ## ## (<cmp> n 0))]
-
-## ## ## [neg? int<]
-## ## ## [pos? int>=])
-
-## ## ## (def (even? n)
-## ## ## (-> Int Bool)
-## ## ## (int= 0 (int% n 0)))
-
-## ## ## (def (odd? n)
-## ## ## (-> Int Bool)
-## ## ## (not (even? n)))
-
-## ## ## (do-templates [<name> <done> <step>]
-## ## ## [(def (<name> n xs)
-## ## ## (All [a]
-## ## ## (-> Int (List a) (List a)))
-## ## ## (if (int> n 0)
-## ## ## (case' xs
-## ## ## #Nil #Nil
-## ## ## (#Cons [x xs']) <step>)
-## ## ## <done>))]
-
-## ## ## [take #Nil (list+ x (take (dec n) xs'))]
-## ## ## [drop xs (drop (dec n) xs')])
-
-## ## ## (do-templates [<name> <done> <step>]
-## ## ## [(def (<name> f xs)
-## ## ## (All [a]
-## ## ## (-> (-> a Bool) (List a) (List a)))
-## ## ## (case' xs
-## ## ## #Nil #Nil
-## ## ## (#Cons [x xs']) (if (f x) <step> #Nil)))]
-
-## ## ## [take-while #Nil (list+ x (take-while f xs'))]
-## ## ## [drop-while xs (drop-while f xs')])
-
-## ## ## ## (defmacro (get@ tokens)
-## ## ## ## (let [output (case' tokens
-## ## ## ## (#Cons [tag (#Cons [record #Nil])])
-## ## ## ## (` (get@' (~ tag) (~ record)))
-
-## ## ## ## (#Cons [tag #Nil])
-## ## ## ## (` (lambda [record] (get@' (~ tag) record))))]
-## ## ## ## (return (list output))))
-
-## ## ## ## (defmacro (set@ tokens)
-## ## ## ## (let [output (case' tokens
-## ## ## ## (#Cons [tag (#Cons [value (#Cons [record #Nil])])])
-## ## ## ## (` (set@' (~ tag) (~ value) (~ record)))
-
-## ## ## ## (#Cons [tag (#Cons [value #Nil])])
-## ## ## ## (` (lambda [record] (set@' (~ tag) (~ value) record)))
-
-## ## ## ## (#Cons [tag #Nil])
-## ## ## ## (` (lambda [value record] (set@' (~ tag) value record))))]
-## ## ## ## (return (list output))))
-
-## ## ## ## (defmacro (update@ tokens)
-## ## ## ## (let [output (case' tokens
-## ## ## ## (#Cons [tag (#Cons [func (#Cons [record #Nil])])])
-## ## ## ## (` (let [_record_ (~ record)]
-## ## ## ## (set@' (~ tag) ((~ func) (get@' (~ tag) _record_)) _record_)))
-
-## ## ## ## (#Cons [tag (#Cons [func #Nil])])
-## ## ## ## (` (lambda [record]
-## ## ## ## (` (set@' (~ tag) ((~ func) (get@' (~ tag) record)) record))))
-
-## ## ## ## (#Cons [tag #Nil])
-## ## ## ## (` (lambda [func record]
-## ## ## ## (set@' (~ tag) (func (get@' (~ tag) record)) record))))]
-## ## ## ## (return (list output))))
-
-## ## ## (def (show-int int)
-## ## ## (-> Int Text)
-## ## ## (jvm-invokevirtual java.lang.Object "toString" []
-## ## ## int []))
-
-## ## ## (def gensym
-## ## ## (LuxStateM Syntax)
-## ## ## (lambda [state]
-## ## ## [(update@ [#gen-seed] inc state)
-## ## ## (_meta (#Symbol ($ text-++ "__" (show-int (get@ [#gen-seed] state)) "__")))]))
-
-## ## ## ## (do-template [<name> <member>]
-## ## ## ## (def (<name> pair)
-## ## ## ## (case' pair
-## ## ## ## [f s]
-## ## ## ## <member>))
-
-## ## ## ## [first f]
-## ## ## ## [second s])
-
-## ## ## (def (show-syntax syntax)
-## ## ## (-> Syntax Text)
-## ## ## (case' syntax
-## ## ## (#Meta [_ (#Bool value)])
-## ## ## (jvm-invokevirtual java.lang.Object "toString" []
-## ## ## value [])
-
-## ## ## (#Meta [_ (#Int value)])
-## ## ## (jvm-invokevirtual java.lang.Object "toString" []
-## ## ## value [])
-
-## ## ## (#Meta [_ (#Real value)])
-## ## ## (jvm-invokevirtual java.lang.Object "toString" []
-## ## ## value [])
-
-## ## ## (#Meta [_ (#Char value)])
-## ## ## (jvm-invokevirtual java.lang.Object "toString" []
-## ## ## value [])
-
-## ## ## (#Meta [_ (#Text value)])
-## ## ## (jvm-invokevirtual java.lang.Object "toString" []
-## ## ## value [])
-
-## ## ## (#Meta [_ (#Symbol [module name])])
-## ## ## ($ text-++ module ";" name)
-
-## ## ## (#Meta [_ (#Tag [module name])])
-## ## ## ($ text-++ "#" module ";" name)
-
-## ## ## (#Meta [_ (#Tuple members)])
-## ## ## ($ text-++ "[" (fold text-++ "" (interpose " " (map show-syntax members))) "]")
-
-## ## ## (#Meta [_ (#Form members)])
-## ## ## ($ text-++ "(" (fold text-++ "" (interpose " " (map show-syntax members))) ")")
-## ## ## ))
-
-## ## ## (defmacro (do tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [(#Meta [_ monad]) (#Cons [(#Meta [_ (#Tuple bindings)]) (#Cons [body #Nil])])])
-## ## ## (let [output (fold (lambda [body binding]
-## ## ## (case' binding
-## ## ## [lhs rhs]
-## ## ## (` (lux;bind (lambda [(~ lhs)] (~ body))
-## ## ## (~ rhs)))))
-## ## ## body
-## ## ## (reverse (as-pairs bindings)))]
-## ## ## (return (list (` (using (~ monad) (~ output))))))))
-
-## ## ## (def (map% f xs)
-## ## ## (All [m a b]
-## ## ## (-> (-> a (m b)) (List a) (m (List b))))
-## ## ## (case' xs
-## ## ## #Nil
-## ## ## (return xs)
-
-## ## ## (#Cons [x xs'])
-## ## ## (do [y (f x)
-## ## ## ys (map% f xs')]
-## ## ## (return (#Cons [y ys])))))
-
-## ## ## ## (defmacro ($keys tokens)
-## ## ## ## (case' tokens
-## ## ## ## (#Cons [(#Meta [_ (#Tuple fields)]) #Nil])
-## ## ## ## (return (list (_meta (#Record (map (lambda [slot]
-## ## ## ## (case' slot
-## ## ## ## (#Meta [_ (#Tag [module name])])
-## ## ## ## [($ text-++ module ";" name) (_meta (#Symbol [module name]))]))
-## ## ## ## fields)))))))
-
-## ## ## ## (defmacro ($or tokens)
-## ## ## ## (case' tokens
-## ## ## ## (#Cons [(#Meta [_ (#Tuple patterns)]) (#Cons [body #Nil])])
-## ## ## ## (return (flat-map (lambda [pattern] (list pattern body))
-## ## ## ## patterns))))
-
-## ## ## ## (def null jvm-null)
-
-## ## ## (defmacro (^ tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [(#Meta [_ (#Symbol [_ class-name])]) #Nil])
-## ## ## (return (list (` (#DataT (~ (_meta (#Text class-name)))))))
-## ## ## ))
-
-## ## ## (defmacro (, members)
-## ## ## (return (list (_meta (#Form (list+ (_meta (#Tag ["lux" "TupleT"])) (untemplate-list members)))))))
-
-## ## ## (defmacro (| members)
-## ## ## (let [members' (map (lambda [m]
-## ## ## (case' m
-## ## ## (#Meta [_ (#Tag [module name])])
-## ## ## [($ text-++ module ";" name) (` (#Tuple (list)))]
-
-## ## ## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Tag [module name])]) (#Cons [value #Nil])]))])
-## ## ## [($ text-++ module ";" name) (` (#Tuple (~ value)))]))
-## ## ## members)]
-## ## ## (return (list (_meta (#Form (list+ (_meta (#Tag ["lux" "VariantT"])) (untemplate-list members))))))))
-
-## ## ## (defmacro (& members)
-## ## ## (let [members' (map (lambda [m]
-## ## ## (case' m
-## ## ## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Tag [module name])]) (#Cons [value #Nil])]))])
-## ## ## [($ text-++ module ";" name) (` (#Tuple (~ value)))]))
-## ## ## members)]
-## ## ## (return (list (_meta (#Form (list+ (_meta (#Tag ["lux" "RecordT"])) (untemplate-list members))))))))
-
-## ## ## (defmacro (-> tokens)
-## ## ## (case' (reverse tokens)
-## ## ## (#Cons [f-return f-args])
-## ## ## (fold (lambda [f-return f-arg]
-## ## ## (` (#LambdaT [(~ f-arg) (~ f-return)])))
-## ## ## f-return
-## ## ## f-args)))
-
-## ## ## (def (text= x y)
-## ## ## (-> Text Text Bool)
-## ## ## (jvm-invokevirtual java.lang.Object "equals" [java.lang.Object]
-## ## ## x [y]))
-
-## ## ## (def (replace-ident ident value syntax)
-## ## ## (-> (, Text Text) Syntax Syntax Syntax)
-## ## ## (let [[module name] ident]
-## ## ## (case' syntax
-## ## ## (#Meta [_ (#Symbol [?module ?name])])
-## ## ## (if (and (text= module ?module)
-## ## ## (text= name ?name))
-## ## ## value
-## ## ## syntax)
-
-## ## ## (#Meta [_ (#Form members)])
-## ## ## (_meta (#Form (map (replace-ident ident value) members)))
-
-## ## ## (#Meta [_ (#Tuple members)])
-## ## ## (_meta (#Tuple (map (replace-ident ident value) members)))
-
-## ## ## (#Meta [_ (#Record members)])
-## ## ## (_meta (#Record (map (lambda [kv]
-## ## ## (case' kv
-## ## ## [k v]
-## ## ## [k (replace-ident ident value v)]))
-## ## ## members)))
-
-## ## ## _
-## ## ## syntax)))
-
-## ## ## (defmacro (All tokens)
-## ## ## (let [[name args body] (case' tokens
-## ## ## (#Cons [(#Meta [_ (#Symbol [_ name])]) (#Cons [(#Meta [_ (#Tuple args)]) (#Cons [body #Nil])])])
-## ## ## [name args body]
-
-## ## ## (#Cons [(#Meta [_ (#Tuple args)]) (#Cons [body #Nil])])
-## ## ## ["" args body])
-## ## ## rolled (fold (lambda [body arg]
-## ## ## (case' arg
-## ## ## (#Meta [_ (#Symbol [arg-module arg-name])])
-## ## ## (` (#AllT (list) "" (~ (_meta (#Text arg-name))) (~ (replace-ident [arg-module arg-name]
-## ## ## (` (#BoundT (~ (#Text arg-name))))
-## ## ## body))))))
-## ## ## body
-## ## ## args)]
-## ## ## (case' rolled
-## ## ## (#Meta [_ (#Form (#Cons [(#Meta [_ (#Tag ["lux" "AllT"])]) (#Cons [env (#Cons [(#Meta [_ (#Text "")]) (#Cons [(#Meta [_ (#Text arg-name)]) (#Cons [body #Nil])])])])]))])
-## ## ## (return (list (` (#AllT (~ env) (~ (#Text name)) (~ (#Text arg-name))
-## ## ## (~ (replace-ident arg-name (` (#BoundT (~ (#Text name))))
-## ## ## body)))))))))
-
-## ## ## (defmacro (Exists tokens)
-## ## ## (case' tokens
-## ## ## (#Cons [args (#Cons [body #Nil])])
-## ## ## (return (list (` (All (~ args) (~ body)))))))
-
-## ## ## (def Any #AnyT)
-## ## ## (def Nothing #NothingT)
-## ## ## (def Bool (^ java.lang.Boolean))
-## ## ## (def Int (^ java.lang.Long))
-## ## ## (def Real (^ java.lang.Double))
-## ## ## (def Char (^ java.lang.Character))
-## ## ## (def Text (^ java.lang.String))
-
-## ## ## (deftype (List a)
-## ## ## (| #Nil
-## ## ## (#Cons (, a (List a)))))
-
-## ## ## (deftype #rec Type
-## ## ## (| #AnyT
-## ## ## #NothingT
-## ## ## (#DataT Text)
-## ## ## (#TupleT (List Type))
-## ## ## (#VariantT (List (, Text Type)))
-## ## ## (#RecordT (List (, Text Type)))
-## ## ## (#LambdaT (, Type Type))
-## ## ## (#BoundT Text)
-## ## ## (#VarT Int)
-## ## ## (#AllT (, (List (, Text Type)) Text Text Type))
-## ## ## (#AppT (, Type Type))))
-
-## ## ## (deftype (Either l r)
-## ## ## (| (#Left l)
-## ## ## (#Right r)))
-
-## ## ## (deftype #rec Syntax
-## ## ## (| (#Bool Bool)
-## ## ## (#Int Int)
-## ## ## (#Real Real)
-## ## ## (#Char Char)
-## ## ## (#Text Text)
-## ## ## (#Form (List Syntax))
-## ## ## (#Tuple (List Syntax))
-## ## ## (#Record (List (, Text Syntax)))))
-
-## ## ## (deftype Macro
-## ## ## (-> (List Syntax) CompilerState
-## ## ## (Either Text (, CompilerState (List Syntax)))))
-
-## ## ## (def (macro-expand syntax)
-## ## ## (-> Syntax (LuxStateM (List Syntax)))
-## ## ## (case' syntax
-## ## ## (#Form (#Cons [(#Symbol macro-name) args]))
-## ## ## (do [macro (get-macro macro-name)]
-## ## ## ((coerce macro Macro) args))))
-
-## ## ## (defmacro (case tokens)
-## ## ## (case' tokens
-## ## ## (#Cons value branches)
-## ## ## (loop [kind #Pattern
-## ## ## pieces branches
-## ## ## new-pieces (list)]
-## ## ## (case' pieces
-## ## ## #Nil
-## ## ## (return (list (' (case' (~ value) (~@ new-pieces)))))
-
-## ## ## (#Cons piece pieces')
-## ## ## (let [[kind' expanded more-pieces] (case' kind
-## ## ## #Body
-## ## ## [#Pattern (list piece) #Nil]
-
-## ## ## #Pattern
-## ## ## (do [expansion (macro-expand piece)]
-## ## ## (case' expansion
-## ## ## #Nil
-## ## ## [#Pattern #Nil #Nil]
-
-## ## ## (#Cons exp #Nil)
-## ## ## [#Body (list exp) #Nil]
-
-## ## ## (#Cons exp exps)
-## ## ## [#Body (list exp) exps]))
-## ## ## )]
-## ## ## (recur kind' (++ expanded new-pieces) (++ more-pieces pieces))))
-## ## ## )))
-
-## ## ## (def (defsyntax tokens)
+## (deftype (List a)
+## (| #Nil
+## (#Cons (, a (List a)))))
+
+## (deftype #rec Type
+## (| #AnyT
+## #NothingT
+## (#DataT Text)
+## (#TupleT (List Type))
+## (#VariantT (List (, Text Type)))
+## (#RecordT (List (, Text Type)))
+## (#LambdaT (, Type Type))
+## (#BoundT Text)
+## (#VarT Int)
+## (#AllT (, (List (, Text Type)) Text Text Type))
+## (#AppT (, Type Type))))
+
+## (deftype (Either l r)
+## (| (#Left l)
+## (#Right r)))
+
+## (deftype #rec Syntax
+## (| (#Bool Bool)
+## (#Int Int)
+## (#Real Real)
+## (#Char Char)
+## (#Text Text)
+## (#Form (List Syntax))
+## (#Tuple (List Syntax))
+## (#Record (List (, Text Syntax)))))
+
+## (deftype Macro
+## (-> (List Syntax) CompilerState
+## (Either Text (, CompilerState (List Syntax)))))
+
+## (def (macro-expand syntax)
+## (-> Syntax (LuxStateM (List Syntax)))
+## (case' syntax
+## (#Form (#Cons [(#Symbol macro-name) args]))
+## (do [macro (get-macro macro-name)]
+## ((coerce macro Macro) args))))
+
+## (defmacro (case tokens)
+## (case' tokens
+## (#Cons value branches)
+## (loop [kind #Pattern
+## pieces branches
+## new-pieces (list)]
+## (case' pieces
+## #Nil
+## (return (list (' (case' (~ value) (~@ new-pieces)))))
+
+## (#Cons piece pieces')
+## (let [[kind' expanded more-pieces] (case' kind
+## #Body
+## [#Pattern (list piece) #Nil]
+
+## #Pattern
+## (do [expansion (macro-expand piece)]
+## (case' expansion
+## #Nil
+## [#Pattern #Nil #Nil]
+
+## (#Cons exp #Nil)
+## [#Body (list exp) #Nil]
+
+## (#Cons exp exps)
+## [#Body (list exp) exps]))
+## )]
+## (recur kind' (++ expanded new-pieces) (++ more-pieces pieces))))
+## )))
+
+## (def (defsyntax tokens)
+## ...)
+
+## (deftype (State s a)
+## (-> s (, s a)))
+
+## (deftype (Parser a)
+## (State (List Syntax) a))
+
+## (def (parse-ctor tokens)
+## (Parser (, Syntax (List Syntax)))
+## (case tokens
+## (list+ (#Symbol name) tokens')
+## [tokens' [(#Symbol name) (list)]]
+
+## (list+ (#Form (list+ (#Symbol name) args)) tokens')
+## [tokens' [(#Symbol name) args]]))
+
+## (defsyntax (defsig
+## [[name args] parse-ctor]
+## [anns ($+ $1)])
+## (let [def-body (fold (lambda [body arg] (` (lambda [(~ arg)] (~ body))))
+## (` (#Record (~ (untemplate-list ...))))
+## args)]
+## (return (list (` (def (~ name) (~ def-body)))))))
+
+## (defsyntax (defstruct
+## [[name args] parse-ctor]
+## signature
+## [defs ($+ $1)])
+## (let [def-body (fold (lambda [body arg] (` (lambda [(~ arg)] (~ body))))
+## (` (#Record (~ (untemplate-list ...))))
+## args)]
+## (return (list (` (def (~ name)
+## (: (~ def-body) (~ signature))))))))
+
+## (defsig (Monad m)
+## (: return (All [a] (-> a (m a))))
+## (: bind (All [a b] (-> (-> a (m b)) (m a) (m b)))))
+
+## (defstruct ListMonad (Monad List)
+## (def (return x)
+## (list x))
+
+## (def bind (. concat map)))
+
+## (defsig (Eq a)
+## (: = (-> a a Bool)))
+
+## (defstruct (List_Eq A_Eq)
+## (All [a] (-> (Eq a) (Eq (List a))))
+
+## (def (= xs ys)
+## (and (= (length xs) (length ys))
+## (map (lambda [[x y]]
+## (with A_Eq
+## (= x y)))
+## (zip2 xs ys)))))
+
+## ## ## (def (with tokens)
## ## ## ...)
-## ## ## (deftype (State s a)
-## ## ## (-> s (, s a)))
+## ## ## TODO: Full pattern-matching
+## ## ## TODO: Type-related macros
+## ## ## TODO: (Im|Ex)ports-related macros
+## ## ## TODO: Macro-related macros
-## ## ## (deftype (Parser a)
-## ## ## (State (List Syntax) a))
+## ## ## (import "lux")
+## ## ## (module-alias "lux" "l")
+## ## ## (def-alias "lux;map" "map")
-## ## ## (def (parse-ctor tokens)
-## ## ## (Parser (, Syntax (List Syntax)))
+## ## ## (def (require tokens)
## ## ## (case tokens
-## ## ## (list+ (#Symbol name) tokens')
-## ## ## [tokens' [(#Symbol name) (list)]]
-
-## ## ## (list+ (#Form (list+ (#Symbol name) args)) tokens')
-## ## ## [tokens' [(#Symbol name) args]]))
-
-## ## ## (defsyntax (defsig
-## ## ## [[name args] parse-ctor]
-## ## ## [anns ($+ $1)])
-## ## ## (let [def-body (fold (lambda [body arg] (` (lambda [(~ arg)] (~ body))))
-## ## ## (` (#Record (~ (untemplate-list ...))))
-## ## ## args)]
-## ## ## (return (list (` (def (~ name) (~ def-body)))))))
-
-## ## ## (defsyntax (defstruct
-## ## ## [[name args] parse-ctor]
-## ## ## signature
-## ## ## [defs ($+ $1)])
-## ## ## (let [def-body (fold (lambda [body arg] (` (lambda [(~ arg)] (~ body))))
-## ## ## (` (#Record (~ (untemplate-list ...))))
-## ## ## args)]
-## ## ## (return (list (` (def (~ name)
-## ## ## (: (~ def-body) (~ signature))))))))
-
-## ## ## (defsig (Monad m)
-## ## ## (: return (All [a] (-> a (m a))))
-## ## ## (: bind (All [a b] (-> (-> a (m b)) (m a) (m b)))))
-
-## ## ## (defstruct ListMonad (Monad List)
-## ## ## (def (return x)
-## ## ## (list x))
-
-## ## ## (def bind (. concat map)))
-
-## ## ## (defsig (Eq a)
-## ## ## (: = (-> a a Bool)))
-
-## ## ## (defstruct (List_Eq A_Eq)
-## ## ## (All [a] (-> (Eq a) (Eq (List a))))
-
-## ## ## (def (= xs ys)
-## ## ## (and (= (length xs) (length ys))
-## ## ## (map (lambda [[x y]]
-## ## ## (with A_Eq
-## ## ## (= x y)))
-## ## ## (zip2 xs ys)))))
-
-## ## ## ## ## (def (with tokens)
-## ## ## ## ## ...)
-
-## ## ## ## ## TODO: Full pattern-matching
-## ## ## ## ## TODO: Type-related macros
-## ## ## ## ## TODO: (Im|Ex)ports-related macros
-## ## ## ## ## TODO: Macro-related macros
-
-## ## ## ## ## (import "lux")
-## ## ## ## ## (module-alias "lux" "l")
-## ## ## ## ## (def-alias "lux;map" "map")
-
-## ## ## ## ## (def (require tokens)
-## ## ## ## ## (case tokens
-## ## ## ## ## ...))
-
-## ## ## ## ## (require lux #as l #refer [map])
+## ## ## ...))
+
+## ## ## (require lux #as l #refer [map])