diff options
| author | Eduardo Julian | 2015-04-19 19:50:10 -0400 | 
|---|---|---|
| committer | Eduardo Julian | 2015-04-19 19:50:10 -0400 | 
| commit | e1df2642c538293f1dfd0faffad72b48a626148a (patch) | |
| tree | ba62cd4c50b193a8c147957f7ca6339f16dd1ff3 /source | |
| parent | 6676e1bb8e79ed4336b113b573f3b9f9dd8399af (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 'source')
| -rw-r--r-- | source/lux.lux | 2346 | 
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])  | 
