aboutsummaryrefslogtreecommitdiff
path: root/miniMAL/reader.json
blob: 4e25b594835450980f390fc0f7ef37ce791dd930 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
["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", ["`", []]]]]],

["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]],
    ["if", ["=", ["`", "nil"], "token"],
      null,
    ["if", ["=", ["`", "true"], "token"],
      true,
    ["if", ["=", ["`", "false"], "token"],
      false,
    ["symbol", "token"]]]]]]]]],

["def", "read-list-entries", ["fn", ["rdr"],
  ["let", ["tok", ["rdr-peek", "rdr"]],
    ["if", "tok",
      ["if", ["=", ["`", ")"], "tok"],
        ["`", []],
        ["cons", ["read-form", "rdr"],
                 ["read-list-entries", "rdr"]]],
      ["throw", ["`", "expected ')'"]]]]]],

["def", "read-list", ["fn", ["rdr"],
  ["let", ["token", ["rdr-next", "rdr"]],
    ["if", ["=", ["`", "("], "token"],
      ["let", ["lst", ["read-list-entries", "rdr"]],
        ["do",
          ["rdr-next", "rdr"],
          "lst"]],
      ["throw", ["`", "expected '('"]]]]]],

["def", "read-form", ["fn", ["rdr"],
  ["let", ["token", ["rdr-peek", "rdr"]],
    ["if", ["=", ["`", ")"], "token"],
      ["throw", ["`", "unexpected ')'"]],
    ["if", ["=", ["`", "("], "token"],
      ["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
]