12 function next(rdr::Reader)
13 if rdr.position > length(rdr.tokens)
17 rdr.tokens[rdr.position-1]
20 function peek(rdr::Reader)
21 if rdr.position > length(rdr.tokens)
24 rdr.tokens[rdr.position]
28 function tokenize(str)
29 re = r"[\s,]*(~@|[\[\]{}()'`~^@]|\"(?:\\.|[^\\\"])*\"|;.*|[^\s\[\]{}('\"`,;)]*)"
30 tokens = map((m) -> m.captures[1], eachmatch(re, str))
31 filter((t) -> t != "" && t[1] != ';', tokens)
34 function read_atom(rdr)
36 if ismatch(r"^-?[0-9]+$", token)
38 elseif ismatch(r"^-?[0-9][0-9.]*$", token)
40 elseif ismatch(r"^\".*\"$", token)
43 replace(token[2:end-1],
47 elseif token[1] == ':'
48 "\u029e$(token[2:end])"
51 elseif token == "true"
53 elseif token == "false"
60 function read_list(rdr, start="(", last=")")
64 error("expected '$(start)'")
66 while ((token = peek(rdr)) != last)
68 error("expected '$(last)', got EOF")
70 push!(ast, read_form(rdr))
76 function read_vector(rdr)
77 lst = read_list(rdr, "[", "]")
81 function read_hash_map(rdr)
82 lst = read_list(rdr, "{", "}")
83 types.hash_map(lst...)
86 function read_form(rdr)
90 [[:quote]; Any[read_form(rdr)]]
93 [[:quasiquote]; Any[read_form(rdr)]]
96 [[:unquote]; Any[read_form(rdr)]]
99 [[symbol("splice-unquote")]; Any[read_form(rdr)]]
102 meta = read_form(rdr)
103 [[symbol("with-meta")]; Any[read_form(rdr)]; Any[meta]]
106 [[symbol("deref")]; Any[read_form(rdr)]]
109 error("unexpected ')'")
113 error("unexpected ']'")
117 error("unexpected '}'")
125 function read_str(str)
126 tokens = tokenize(str)
127 if length(tokens) == 0
130 read_form(Reader(tokens, 1))