aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/lux/host/io.lux31
-rw-r--r--source/lux/host/jvm.lux4
-rw-r--r--src/lux/analyser/base.clj226
-rw-r--r--src/lux/analyser/case.clj36
-rw-r--r--src/lux/analyser/module.clj13
-rw-r--r--src/lux/base.clj127
-rw-r--r--src/lux/lexer.clj32
-rw-r--r--src/lux/reader.clj8
8 files changed, 251 insertions, 226 deletions
diff --git a/source/lux/host/io.lux b/source/lux/host/io.lux
index 7c017a62e..4542b0519 100644
--- a/source/lux/host/io.lux
+++ b/source/lux/host/io.lux
@@ -4,7 +4,12 @@
## You can obtain one at http://mozilla.org/MPL/2.0/.
(;import lux
- lux/data/io
+ (lux (data io
+ (list #refer #all #open ("" List/Fold)))
+ (meta ast
+ syntax
+ lux)
+ control/monad)
(.. jvm))
## [Functions]
@@ -16,7 +21,8 @@
[write-char "print" Char "char"]
[write "print" Text "java.lang.String"]
- [write-line "println" Text "java.lang.String"])
+ [write-line "println" Text "java.lang.String"]
+ )
(do-template [<name> <type> <op>]
[(def #export <name>
@@ -24,7 +30,7 @@
(let [in (_jvm_getstatic "java.lang.System" "in")
reader (_jvm_new "java.io.InputStreamReader" ["java.io.InputStream"] [in])
buff-reader (_jvm_new "java.io.BufferedReader" ["java.io.Reader"] [reader])]
- (@io (let [output (: (Either Text <type>) (try$ <op>))]
+ (@io (let [output (: (Either Text <type>) (try <op>))]
(exec (_jvm_invokeinterface "java.io.Closeable" "close" [] buff-reader [])
(case output
(#;Left _) #;None
@@ -33,3 +39,22 @@
[read-char Char (_jvm_i2c (_jvm_invokevirtual "java.io.BufferedReader" "read" [] buff-reader []))]
[read-line Text (_jvm_invokevirtual "java.io.BufferedReader" "readLine" [] buff-reader [])]
)
+
+## [Syntax]
+(def simple-bindings^
+ (Parser (List (, Text AST)))
+ (tuple^ (*^ (&^ local-symbol^ id^))))
+
+(defsyntax #export (with-open [bindings simple-bindings^] body)
+ (do Lux/Monad
+ [g!output (gensym "output")
+ #let [code (foldL (: (-> AST (, Text AST) AST)
+ (lambda [body [res-name res-value]]
+ (let [g!res-name (symbol$ ["" res-name])]
+ (` (let [(~ g!res-name) (~ res-value)
+ (~ g!output) (~ body)]
+ (exec (;_jvm_invokeinterface "java.io.Closeable" "close" [] (~ g!res-name) [])
+ (~ g!output)))))))
+ body
+ (reverse bindings))]]
+ (wrap (@list code))))
diff --git a/source/lux/host/jvm.lux b/source/lux/host/jvm.lux
index 6f121a633..c1e122bb6 100644
--- a/source/lux/host/jvm.lux
+++ b/source/lux/host/jvm.lux
@@ -95,7 +95,7 @@
(emit (@list (` (;_jvm_program (~ (symbol$ args))
(~ body))))))
-(defsyntax #export (->maybe expr)
+(defsyntax #export (??? expr)
(do Lux/Monad
[g!val (gensym "")]
(emit (@list (` (let [(~ g!val) (~ expr)]
@@ -103,7 +103,7 @@
#;None
(#;Some (~ g!val)))))))))
-(defsyntax #export (try$ expr)
+(defsyntax #export (try expr)
(emit (@list (` (;_jvm_try (#;Right (~ expr))
(~ (' (_jvm_catch "java.lang.Exception" e
(#;Left (_jvm_invokevirtual "java.lang.Throwable" "getMessage" [] e []))))))))))
diff --git a/src/lux/analyser/base.clj b/src/lux/analyser/base.clj
index 1507a3a76..0bb40c71b 100644
--- a/src/lux/analyser/base.clj
+++ b/src/lux/analyser/base.clj
@@ -10,120 +10,118 @@
[type :as &type])))
;; [Tags]
-(deftags ""
- "bool"
- "int"
- "real"
- "char"
- "text"
- "variant"
- "tuple"
- "apply"
- "case"
- "lambda"
- "ann"
- "def"
- "declare-macro"
- "var"
- "captured"
-
- "jvm-getstatic"
- "jvm-getfield"
- "jvm-putstatic"
- "jvm-putfield"
- "jvm-invokestatic"
- "jvm-instanceof"
- "jvm-invokevirtual"
- "jvm-invokeinterface"
- "jvm-invokespecial"
- "jvm-null?"
- "jvm-null"
- "jvm-new"
- "jvm-new-array"
- "jvm-aastore"
- "jvm-aaload"
- "jvm-class"
- "jvm-interface"
- "jvm-try"
- "jvm-throw"
- "jvm-monitorenter"
- "jvm-monitorexit"
- "jvm-program"
-
- "jvm-iadd"
- "jvm-isub"
- "jvm-imul"
- "jvm-idiv"
- "jvm-irem"
- "jvm-ieq"
- "jvm-ilt"
- "jvm-igt"
-
- "jvm-ceq"
- "jvm-clt"
- "jvm-cgt"
-
- "jvm-ladd"
- "jvm-lsub"
- "jvm-lmul"
- "jvm-ldiv"
- "jvm-lrem"
- "jvm-leq"
- "jvm-llt"
- "jvm-lgt"
-
- "jvm-fadd"
- "jvm-fsub"
- "jvm-fmul"
- "jvm-fdiv"
- "jvm-frem"
- "jvm-feq"
- "jvm-flt"
- "jvm-fgt"
-
- "jvm-dadd"
- "jvm-dsub"
- "jvm-dmul"
- "jvm-ddiv"
- "jvm-drem"
- "jvm-deq"
- "jvm-dlt"
- "jvm-dgt"
-
- "jvm-d2f"
- "jvm-d2i"
- "jvm-d2l"
-
- "jvm-f2d"
- "jvm-f2i"
- "jvm-f2l"
-
- "jvm-i2b"
- "jvm-i2c"
- "jvm-i2d"
- "jvm-i2f"
- "jvm-i2l"
- "jvm-i2s"
-
- "jvm-l2d"
- "jvm-l2f"
- "jvm-l2i"
-
- "jvm-iand"
- "jvm-ior"
- "jvm-ixor"
- "jvm-ishl"
- "jvm-ishr"
- "jvm-iushr"
-
- "jvm-land"
- "jvm-lor"
- "jvm-lxor"
- "jvm-lshl"
- "jvm-lshr"
- "jvm-lushr"
-
- )
+(deftags
+ ["bool"
+ "int"
+ "real"
+ "char"
+ "text"
+ "variant"
+ "tuple"
+ "apply"
+ "case"
+ "lambda"
+ "ann"
+ "def"
+ "declare-macro"
+ "var"
+ "captured"
+
+ "jvm-getstatic"
+ "jvm-getfield"
+ "jvm-putstatic"
+ "jvm-putfield"
+ "jvm-invokestatic"
+ "jvm-instanceof"
+ "jvm-invokevirtual"
+ "jvm-invokeinterface"
+ "jvm-invokespecial"
+ "jvm-null?"
+ "jvm-null"
+ "jvm-new"
+ "jvm-new-array"
+ "jvm-aastore"
+ "jvm-aaload"
+ "jvm-class"
+ "jvm-interface"
+ "jvm-try"
+ "jvm-throw"
+ "jvm-monitorenter"
+ "jvm-monitorexit"
+ "jvm-program"
+
+ "jvm-iadd"
+ "jvm-isub"
+ "jvm-imul"
+ "jvm-idiv"
+ "jvm-irem"
+ "jvm-ieq"
+ "jvm-ilt"
+ "jvm-igt"
+
+ "jvm-ceq"
+ "jvm-clt"
+ "jvm-cgt"
+
+ "jvm-ladd"
+ "jvm-lsub"
+ "jvm-lmul"
+ "jvm-ldiv"
+ "jvm-lrem"
+ "jvm-leq"
+ "jvm-llt"
+ "jvm-lgt"
+
+ "jvm-fadd"
+ "jvm-fsub"
+ "jvm-fmul"
+ "jvm-fdiv"
+ "jvm-frem"
+ "jvm-feq"
+ "jvm-flt"
+ "jvm-fgt"
+
+ "jvm-dadd"
+ "jvm-dsub"
+ "jvm-dmul"
+ "jvm-ddiv"
+ "jvm-drem"
+ "jvm-deq"
+ "jvm-dlt"
+ "jvm-dgt"
+
+ "jvm-d2f"
+ "jvm-d2i"
+ "jvm-d2l"
+
+ "jvm-f2d"
+ "jvm-f2i"
+ "jvm-f2l"
+
+ "jvm-i2b"
+ "jvm-i2c"
+ "jvm-i2d"
+ "jvm-i2f"
+ "jvm-i2l"
+ "jvm-i2s"
+
+ "jvm-l2d"
+ "jvm-l2f"
+ "jvm-l2i"
+
+ "jvm-iand"
+ "jvm-ior"
+ "jvm-ixor"
+ "jvm-ishl"
+ "jvm-ishr"
+ "jvm-iushr"
+
+ "jvm-land"
+ "jvm-lor"
+ "jvm-lxor"
+ "jvm-lshl"
+ "jvm-lshr"
+ "jvm-lushr"])
;; [Exports]
(defn expr-type* [syntax+]
diff --git a/src/lux/analyser/case.clj b/src/lux/analyser/case.clj
index 7226b98e4..a0f07cdce 100644
--- a/src/lux/analyser/case.clj
+++ b/src/lux/analyser/case.clj
@@ -15,26 +15,26 @@
[record :as &&record])))
;; [Tags]
-(deftags ""
- "DefaultTotal"
- "BoolTotal"
- "IntTotal"
- "RealTotal"
- "CharTotal"
- "TextTotal"
- "TupleTotal"
- "VariantTotal"
+(deftags
+ ["DefaultTotal"
+ "BoolTotal"
+ "IntTotal"
+ "RealTotal"
+ "CharTotal"
+ "TextTotal"
+ "TupleTotal"
+ "VariantTotal"]
)
-(deftags ""
- "StoreTestAC"
- "BoolTestAC"
- "IntTestAC"
- "RealTestAC"
- "CharTestAC"
- "TextTestAC"
- "TupleTestAC"
- "VariantTestAC"
+(deftags
+ ["StoreTestAC"
+ "BoolTestAC"
+ "IntTestAC"
+ "RealTestAC"
+ "CharTestAC"
+ "TextTestAC"
+ "TupleTestAC"
+ "VariantTestAC"]
)
;; [Utils]
diff --git a/src/lux/analyser/module.clj b/src/lux/analyser/module.clj
index aaed26a7a..6740d6515 100644
--- a/src/lux/analyser/module.clj
+++ b/src/lux/analyser/module.clj
@@ -14,12 +14,13 @@
[host :as &host])))
;; [Utils]
-(deftags ""
- "module-aliases"
- "defs"
- "imports"
- "tags"
- "types")
+(deftags
+ ["module-aliases"
+ "defs"
+ "imports"
+ "tags"
+ "types"])
+
(def ^:private +init+
(&/T ;; "lux;module-aliases"
(&/|table)
diff --git a/src/lux/base.clj b/src/lux/base.clj
index 4db1d26bc..c0f28f519 100644
--- a/src/lux/base.clj
+++ b/src/lux/base.clj
@@ -9,93 +9,94 @@
clojure.core.match.array))
;; [Tags]
-(defmacro deftags [prefix & names]
+(defmacro deftags [names]
+ (assert (vector? names))
`(do ~@(for [[name idx] (map vector names (range (count names)))]
`(def ~(symbol (str "$" name)) ~idx))))
;; List
-(deftags ""
- "Nil"
- "Cons")
+(deftags
+ ["Nil"
+ "Cons"])
;; Maybe
-(deftags ""
- "None"
- "Some")
+(deftags
+ ["None"
+ "Some"])
;; Either
-(deftags ""
- "Left"
- "Right")
+(deftags
+ ["Left"
+ "Right"])
;; AST
-(deftags ""
- "BoolS"
- "IntS"
- "RealS"
- "CharS"
- "TextS"
- "SymbolS"
- "TagS"
- "FormS"
- "TupleS"
- "RecordS")
+(deftags
+ ["BoolS"
+ "IntS"
+ "RealS"
+ "CharS"
+ "TextS"
+ "SymbolS"
+ "TagS"
+ "FormS"
+ "TupleS"
+ "RecordS"])
;; Type
-(deftags ""
- "DataT"
- "VariantT"
- "TupleT"
- "LambdaT"
- "BoundT"
- "VarT"
- "ExT"
- "UnivQ"
- "ExQ"
- "AppT"
- "NamedT")
+(deftags
+ ["DataT"
+ "VariantT"
+ "TupleT"
+ "LambdaT"
+ "BoundT"
+ "VarT"
+ "ExT"
+ "UnivQ"
+ "ExQ"
+ "AppT"
+ "NamedT"])
;; Vars
-(deftags "lux;"
- "Local"
- "Global")
+(deftags
+ ["Local"
+ "Global"])
;; Definitions
-(deftags "lux;"
- "ValueD"
- "TypeD"
- "MacroD"
- "AliasD")
+(deftags
+ ["ValueD"
+ "TypeD"
+ "MacroD"
+ "AliasD"])
;; Binding
-(deftags ""
- "counter"
- "mappings")
+(deftags
+ ["counter"
+ "mappings"])
;; Env
-(deftags ""
- "name"
- "inner-closures"
- "locals"
- "closure")
+(deftags
+ ["name"
+ "inner-closures"
+ "locals"
+ "closure"])
;; Host
-(deftags ""
- "writer"
- "loader"
- "classes")
+(deftags
+ ["writer"
+ "loader"
+ "classes"])
;; Compiler
-(deftags ""
- "source"
- "cursor"
- "modules"
- "envs"
- "type-vars"
- "expected"
- "seed"
- "eval?"
- "host")
+(deftags
+ ["source"
+ "cursor"
+ "modules"
+ "envs"
+ "type-vars"
+ "expected"
+ "seed"
+ "eval?"
+ "host"])
;; [Exports]
(def datum-field "_datum")
diff --git a/src/lux/lexer.clj b/src/lux/lexer.clj
index b3a47f3e0..fd694c51c 100644
--- a/src/lux/lexer.clj
+++ b/src/lux/lexer.clj
@@ -10,22 +10,22 @@
[lux.analyser.module :as &module]))
;; [Tags]
-(deftags ""
- "White_Space"
- "Comment"
- "Bool"
- "Int"
- "Real"
- "Char"
- "Text"
- "Symbol"
- "Tag"
- "Open_Paren"
- "Close_Paren"
- "Open_Bracket"
- "Close_Bracket"
- "Open_Brace"
- "Close_Brace"
+(deftags
+ ["White_Space"
+ "Comment"
+ "Bool"
+ "Int"
+ "Real"
+ "Char"
+ "Text"
+ "Symbol"
+ "Tag"
+ "Open_Paren"
+ "Close_Paren"
+ "Open_Bracket"
+ "Close_Bracket"
+ "Open_Brace"
+ "Close_Brace"]
)
;; [Utils]
diff --git a/src/lux/reader.clj b/src/lux/reader.clj
index 7b1559f07..751df7e6d 100644
--- a/src/lux/reader.clj
+++ b/src/lux/reader.clj
@@ -10,10 +10,10 @@
[lux.base :as & :refer [deftags |do return* return fail fail* |let |case]]))
;; [Tags]
-(deftags ""
- "No"
- "Done"
- "Yes")
+(deftags
+ ["No"
+ "Done"
+ "Yes"])
;; [Utils]
(defn ^:private with-line [body]