miniMAL: step2
[jackhill/mal.git] / miniMAL / reader.json
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"]]],
29 ["re-matches", "re", "strn", ["`", []]]]]],
30
31 ["def", "read-atom", ["fn", ["rdr"],
32 ["let", ["token", ["rdr-next", "rdr"]],
33 ["if", [".", "token", ["`", "match"], ["RegExp", ["`", "^-?[0-9]+$"]]],
34 ["parseInt", "token", 10],
35 ["if", ["=", ["`", "\""], ["get", "token", 0]],
36 ["slice", "token", 1, ["-", ["count", "token"], 1]],
37 ["if", ["=", ["`", "nil"], "token"],
38 null,
39 ["if", ["=", ["`", "true"], "token"],
40 true,
41 ["if", ["=", ["`", "false"], "token"],
42 false,
43 ["symbol", "token"]]]]]]]]],
44
45 ["def", "read-list-entries", ["fn", ["rdr"],
46 ["let", ["tok", ["rdr-peek", "rdr"]],
47 ["if", "tok",
48 ["if", ["=", ["`", ")"], "tok"],
49 ["`", []],
50 ["cons", ["read-form", "rdr"],
51 ["read-list-entries", "rdr"]]],
52 ["throw", ["`", "expected ')'"]]]]]],
53
54 ["def", "read-list", ["fn", ["rdr"],
55 ["let", ["token", ["rdr-next", "rdr"]],
56 ["if", ["=", ["`", "("], "token"],
57 ["let", ["lst", ["read-list-entries", "rdr"]],
58 ["do",
59 ["rdr-next", "rdr"],
60 "lst"]],
61 ["throw", ["`", "expected '('"]]]]]],
62
63 ["def", "read-form", ["fn", ["rdr"],
64 ["let", ["token", ["rdr-peek", "rdr"]],
65 ["if", ["=", ["`", ")"], "token"],
66 ["throw", ["`", "unexpected ')'"]],
67 ["if", ["=", ["`", "("], "token"],
68 ["read-list", "rdr"],
69 ["read-atom", "rdr"]]]]]],
70
71 ["def", "read-str", ["fn", ["strn"],
72 ["let", ["tokens", ["tokenize", "strn"],
73 "rdr", ["rdr-new", "tokens"]],
74 ["if", ["empty?", "tokens"],
75 null,
76 ["read-form", "rdr"]]]]],
77
78 null
79 ]