mirror of
https://github.com/kanaka/mal.git
synced 2024-11-11 00:52:44 +03:00
129 lines
4.4 KiB
JSON
129 lines
4.4 KiB
JSON
["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"]],
|
|
["fn", ["_", "c"],
|
|
["if", ["=", "c", ["`", "n"]],
|
|
["`", "\n"],
|
|
"c"]]],
|
|
["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
|
|
]
|