["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 ]