diff options
Diffstat (limited to 'miniMAL/reader.json')
| -rw-r--r-- | miniMAL/reader.json | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/miniMAL/reader.json b/miniMAL/reader.json new file mode 100644 index 0000000..2cdcde4 --- /dev/null +++ b/miniMAL/reader.json @@ -0,0 +1,80 @@ +["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, + ["hash-map", ["`", "type"], ["`", "Symbol"], + ["`", "val"], "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 +] |
