1
1
mirror of https://github.com/kanaka/mal.git synced 2024-11-10 12:47:45 +03:00
mal/miniMAL/reader.json
2015-02-11 22:31:39 -06:00

80 lines
2.5 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", ["`", []]]]]],
["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]],
["if", ["=", ["`", "nil"], "token"],
null,
["if", ["=", ["`", "true"], "token"],
true,
["if", ["=", ["`", "false"], "token"],
false,
["symbol", "token"]]]]]]]]],
["def", "read-list-entries", ["fn", ["rdr"],
["let", ["tok", ["rdr-peek", "rdr"]],
["if", "tok",
["if", ["=", ["`", ")"], "tok"],
["`", []],
["cons", ["read-form", "rdr"],
["read-list-entries", "rdr"]]],
["throw", ["`", "expected ')'"]]]]]],
["def", "read-list", ["fn", ["rdr"],
["let", ["token", ["rdr-next", "rdr"]],
["if", ["=", ["`", "("], "token"],
["let", ["lst", ["read-list-entries", "rdr"]],
["do",
["rdr-next", "rdr"],
"lst"]],
["throw", ["`", "expected '('"]]]]]],
["def", "read-form", ["fn", ["rdr"],
["let", ["token", ["rdr-peek", "rdr"]],
["if", ["=", ["`", ")"], "token"],
["throw", ["`", "unexpected ')'"]],
["if", ["=", ["`", "("], "token"],
["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
]