aboutsummaryrefslogtreecommitdiff
path: root/miniMAL/reader.json
diff options
context:
space:
mode:
Diffstat (limited to 'miniMAL/reader.json')
-rw-r--r--miniMAL/reader.json126
1 files changed, 126 insertions, 0 deletions
diff --git a/miniMAL/reader.json b/miniMAL/reader.json
new file mode 100644
index 0000000..5fa113b
--- /dev/null
+++ b/miniMAL/reader.json
@@ -0,0 +1,126 @@
+["do",
+
+["def", "rdr-new", ["fn", ["tokens"],
+ ["hash-map", ["`", "tokens"], "tokens",
+ ["`", "position"], 0]]],
+
+["def", "rdr-next", ["fn", ["rdr"],
+ ["let", ["pos", ["get", "rdr", ["`", "position"]],
+ "val", ["get", ["get", "rdr", ["`", "tokens"]], "pos"]],
+ ["do",
+ ["assoc!", "rdr", ["`", "position"], ["+", 1, "pos"]],
+ "val"]]]],
+
+["def", "rdr-peek", ["fn", ["rdr"],
+ ["let", ["pos", ["get", "rdr", ["`", "position"]]],
+ ["get", ["get", "rdr", ["`", "tokens"]], "pos"]]]],
+
+
+["def", "re-matches", ["fn", ["re", "strn", "acc"],
+ ["let", ["match", [".", "re", ["`", "exec"], "strn"],
+ "g1", ["get", "match", 1]],
+ ["if", ["=", "g1", ["`", ""]],
+ "acc",
+ ["re-matches", "re", "strn", ["concat", "acc", "g1"]]]]]],
+
+["def", "tokenize", ["fn", ["strn"],
+ ["let", ["re-str", ["`", "[\\s,]*(~@|[\\[\\]{}()'`~^@]|\"(?:\\\\.|[^\\\\\"])*\"|;.*|[^\\s\\[\\]{}('\"`,;)]*)"],
+ "re", ["RegExp", "re-str", ["`", "g"]]],
+ [".",
+ ["re-matches", "re", "strn", ["`", []]],
+ ["`", "filter"],
+ ["fn", ["x"], ["not", ["=", ["get", "x", 0],
+ ["`", ";"]]]]]]]],
+
+["def", "read-atom", ["fn", ["rdr"],
+ ["let", ["token", ["rdr-next", "rdr"]],
+ ["if", [".", "token", ["`", "match"], ["RegExp", ["`", "^-?[0-9]+$"]]],
+ ["parseInt", "token", 10],
+ ["if", ["=", ["`", "\""], ["get", "token", 0]],
+ [".",
+ [".",
+ ["slice", "token", 1, ["-", ["count", "token"], 1]],
+ ["`", "replace"], ["RegExp", ["`", "\\\\\""], ["`", "g"]], ["`", "\""]],
+ ["`", "replace"], ["RegExp", ["`", "\\\\n"], ["`", "g"]], ["`", "\n"]],
+ ["if", ["=", ["`", ":"], ["get", "token", 0]],
+ ["keyword", ["slice", "token", 1]],
+ ["if", ["=", ["`", "nil"], "token"],
+ null,
+ ["if", ["=", ["`", "true"], "token"],
+ true,
+ ["if", ["=", ["`", "false"], "token"],
+ false,
+ ["symbol", "token"]]]]]]]]]],
+
+["def", "read-list-entries", ["fn", ["rdr", "start", "end"],
+ ["let", ["tok", ["rdr-peek", "rdr"]],
+ ["if", "tok",
+ ["if", ["=", "end", "tok"],
+ ["`", []],
+ ["cons", ["read-form", "rdr"],
+ ["read-list-entries", "rdr", "start", "end"]]],
+ ["throw", ["str", ["`", "expected "], "end"]]]]]],
+
+["def", "read-list", ["fn", ["rdr", "start", "end"],
+ ["let", ["token", ["rdr-next", "rdr"]],
+ ["if", ["=", "start", "token"],
+ ["let", ["lst", ["read-list-entries", "rdr", "start", "end"]],
+ ["do",
+ ["rdr-next", "rdr"],
+ "lst"]],
+ ["throw", ["str", ["`", "expected "], "start"]]]]]],
+
+["def", "read-form", ["fn", ["rdr"],
+ ["let", ["token", ["rdr-peek", "rdr"]],
+ ["if", ["=", ["`", "'"], "token"],
+ ["do",
+ ["rdr-next", "rdr"],
+ ["list", ["symbol", ["`", "quote"]], ["read-form", "rdr"]]],
+ ["if", ["=", ["`", "`"], "token"],
+ ["do",
+ ["rdr-next", "rdr"],
+ ["list", ["symbol", ["`", "quasiquote"]], ["read-form", "rdr"]]],
+ ["if", ["=", ["`", "~"], "token"],
+ ["do",
+ ["rdr-next", "rdr"],
+ ["list", ["symbol", ["`", "unquote"]], ["read-form", "rdr"]]],
+ ["if", ["=", ["`", "~@"], "token"],
+ ["do",
+ ["rdr-next", "rdr"],
+ ["list", ["symbol", ["`", "splice-unquote"]], ["read-form", "rdr"]]],
+ ["if", ["=", ["`", "^"], "token"],
+ ["do",
+ ["rdr-next", "rdr"],
+ ["let", ["meta", ["read-form", "rdr"]],
+ ["list", ["symbol", ["`", "with-meta"]], ["read-form", "rdr"], "meta"]]],
+ ["if", ["=", ["`", "@"], "token"],
+ ["do",
+ ["rdr-next", "rdr"],
+ ["list", ["symbol", ["`", "deref"]], ["read-form", "rdr"]]],
+
+ ["if", ["=", ["`", ")"], "token"],
+ ["throw", ["`", "unexpected ')'"]],
+ ["if", ["=", ["`", "("], "token"],
+ ["read-list", "rdr", ["`", "("], ["`", ")"]],
+
+ ["if", ["=", ["`", "]"], "token"],
+ ["throw", ["`", "unexpected ']'"]],
+ ["if", ["=", ["`", "["], "token"],
+ ["vectorl", ["read-list", "rdr", ["`", "["], ["`", "]"]]],
+
+ ["if", ["=", ["`", "}"], "token"],
+ ["throw", ["`", "unexpected '}'"]],
+ ["if", ["=", ["`", "{"], "token"],
+ ["apply", "hash-map", ["read-list", "rdr", ["`", "{"], ["`", "}"]]],
+
+ ["read-atom", "rdr"]]]]]]]]]]]]]]]],
+
+["def", "read-str", ["fn", ["strn"],
+ ["let", ["tokens", ["tokenize", "strn"],
+ "rdr", ["rdr-new", "tokens"]],
+ ["if", ["empty?", "tokens"],
+ null,
+ ["read-form", "rdr"]]]]],
+
+null
+]