Commit | Line | Data |
---|---|---|
c1fe72ae JM |
1 | ["do", |
2 | ||
3 | ["def", "rdr-new", ["fn", ["tokens"], | |
4 | ["hash-map", ["`", "tokens"], "tokens", | |
5 | ["`", "position"], 0]]], | |
6 | ||
7 | ["def", "rdr-next", ["fn", ["rdr"], | |
8 | ["let", ["pos", ["get", "rdr", ["`", "position"]], | |
9 | "val", ["get", ["get", "rdr", ["`", "tokens"]], "pos"]], | |
10 | ["do", | |
11 | ["assoc!", "rdr", ["`", "position"], ["+", 1, "pos"]], | |
12 | "val"]]]], | |
13 | ||
14 | ["def", "rdr-peek", ["fn", ["rdr"], | |
15 | ["let", ["pos", ["get", "rdr", ["`", "position"]]], | |
16 | ["get", ["get", "rdr", ["`", "tokens"]], "pos"]]]], | |
17 | ||
18 | ||
19 | ["def", "re-matches", ["fn", ["re", "strn", "acc"], | |
20 | ["let", ["match", [".", "re", ["`", "exec"], "strn"], | |
21 | "g1", ["get", "match", 1]], | |
22 | ["if", ["=", "g1", ["`", ""]], | |
23 | "acc", | |
24 | ["re-matches", "re", "strn", ["concat", "acc", "g1"]]]]]], | |
25 | ||
26 | ["def", "tokenize", ["fn", ["strn"], | |
27 | ["let", ["re-str", ["`", "[\\s,]*(~@|[\\[\\]{}()'`~^@]|\"(?:\\\\.|[^\\\\\"])*\"|;.*|[^\\s\\[\\]{}('\"`,;)]*)"], | |
28 | "re", ["RegExp", "re-str", ["`", "g"]]], | |
d90c7844 JM |
29 | [".", |
30 | ["re-matches", "re", "strn", ["`", []]], | |
31 | ["`", "filter"], | |
32 | ["fn", ["x"], ["not", ["=", ["get", "x", 0], | |
33 | ["`", ";"]]]]]]]], | |
c1fe72ae JM |
34 | |
35 | ["def", "read-atom", ["fn", ["rdr"], | |
36 | ["let", ["token", ["rdr-next", "rdr"]], | |
37 | ["if", [".", "token", ["`", "match"], ["RegExp", ["`", "^-?[0-9]+$"]]], | |
38 | ["parseInt", "token", 10], | |
39 | ["if", ["=", ["`", "\""], ["get", "token", 0]], | |
c5d30235 JM |
40 | [".", |
41 | [".", | |
42 | ["slice", "token", 1, ["-", ["count", "token"], 1]], | |
43 | ["`", "replace"], ["RegExp", ["`", "\\\\\""], ["`", "g"]], ["`", "\""]], | |
44 | ["`", "replace"], ["RegExp", ["`", "\\\\n"], ["`", "g"]], ["`", "\n"]], | |
32045546 JM |
45 | ["if", ["=", ["`", ":"], ["get", "token", 0]], |
46 | ["keyword", ["slice", "token", 1]], | |
c1fe72ae JM |
47 | ["if", ["=", ["`", "nil"], "token"], |
48 | null, | |
49 | ["if", ["=", ["`", "true"], "token"], | |
50 | true, | |
51 | ["if", ["=", ["`", "false"], "token"], | |
52 | false, | |
32045546 | 53 | ["symbol", "token"]]]]]]]]]], |
c1fe72ae | 54 | |
32045546 | 55 | ["def", "read-list-entries", ["fn", ["rdr", "start", "end"], |
c1fe72ae JM |
56 | ["let", ["tok", ["rdr-peek", "rdr"]], |
57 | ["if", "tok", | |
32045546 | 58 | ["if", ["=", "end", "tok"], |
c1fe72ae JM |
59 | ["`", []], |
60 | ["cons", ["read-form", "rdr"], | |
32045546 JM |
61 | ["read-list-entries", "rdr", "start", "end"]]], |
62 | ["throw", ["str", ["`", "expected "], "end"]]]]]], | |
c1fe72ae | 63 | |
32045546 | 64 | ["def", "read-list", ["fn", ["rdr", "start", "end"], |
c1fe72ae | 65 | ["let", ["token", ["rdr-next", "rdr"]], |
32045546 JM |
66 | ["if", ["=", "start", "token"], |
67 | ["let", ["lst", ["read-list-entries", "rdr", "start", "end"]], | |
c1fe72ae JM |
68 | ["do", |
69 | ["rdr-next", "rdr"], | |
70 | "lst"]], | |
32045546 | 71 | ["throw", ["str", ["`", "expected "], "start"]]]]]], |
c1fe72ae JM |
72 | |
73 | ["def", "read-form", ["fn", ["rdr"], | |
74 | ["let", ["token", ["rdr-peek", "rdr"]], | |
1981bf57 JM |
75 | ["if", ["=", ["`", "'"], "token"], |
76 | ["do", | |
77 | ["rdr-next", "rdr"], | |
78 | ["list", ["symbol", ["`", "quote"]], ["read-form", "rdr"]]], | |
79 | ["if", ["=", ["`", "`"], "token"], | |
80 | ["do", | |
81 | ["rdr-next", "rdr"], | |
82 | ["list", ["symbol", ["`", "quasiquote"]], ["read-form", "rdr"]]], | |
83 | ["if", ["=", ["`", "~"], "token"], | |
84 | ["do", | |
85 | ["rdr-next", "rdr"], | |
86 | ["list", ["symbol", ["`", "unquote"]], ["read-form", "rdr"]]], | |
87 | ["if", ["=", ["`", "~@"], "token"], | |
88 | ["do", | |
89 | ["rdr-next", "rdr"], | |
90 | ["list", ["symbol", ["`", "splice-unquote"]], ["read-form", "rdr"]]], | |
ad28cf3c JM |
91 | ["if", ["=", ["`", "^"], "token"], |
92 | ["do", | |
93 | ["rdr-next", "rdr"], | |
94 | ["let", ["meta", ["read-form", "rdr"]], | |
95 | ["list", ["symbol", ["`", "with-meta"]], ["read-form", "rdr"], "meta"]]], | |
96 | ["if", ["=", ["`", "@"], "token"], | |
97 | ["do", | |
98 | ["rdr-next", "rdr"], | |
99 | ["list", ["symbol", ["`", "deref"]], ["read-form", "rdr"]]], | |
1981bf57 | 100 | |
c1fe72ae JM |
101 | ["if", ["=", ["`", ")"], "token"], |
102 | ["throw", ["`", "unexpected ')'"]], | |
103 | ["if", ["=", ["`", "("], "token"], | |
32045546 JM |
104 | ["read-list", "rdr", ["`", "("], ["`", ")"]], |
105 | ||
106 | ["if", ["=", ["`", "]"], "token"], | |
107 | ["throw", ["`", "unexpected ']'"]], | |
108 | ["if", ["=", ["`", "["], "token"], | |
109 | ["vectorl", ["read-list", "rdr", ["`", "["], ["`", "]"]]], | |
110 | ||
111 | ["if", ["=", ["`", "}"], "token"], | |
112 | ["throw", ["`", "unexpected '}'"]], | |
113 | ["if", ["=", ["`", "{"], "token"], | |
114 | ["apply", "hash-map", ["read-list", "rdr", ["`", "{"], ["`", "}"]]], | |
115 | ||
ad28cf3c | 116 | ["read-atom", "rdr"]]]]]]]]]]]]]]]], |
c1fe72ae JM |
117 | |
118 | ["def", "read-str", ["fn", ["strn"], | |
119 | ["let", ["tokens", ["tokenize", "strn"], | |
120 | "rdr", ["rdr-new", "tokens"]], | |
121 | ["if", ["empty?", "tokens"], | |
122 | null, | |
123 | ["read-form", "rdr"]]]]], | |
124 | ||
125 | null | |
126 | ] |