fsharp: step 4: Added list and comparison functions.
[jackhill/mal.git] / miniMAL / reader.json
CommitLineData
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
125null
126]