Change quasiquote algorithm
[jackhill/mal.git] / impls / miniMAL / types.json
1 ["do",
2
3 ["`", "Utility Functions"],
4 ["def", "_cmp_seqs", ["fn", ["a", "b"],
5 ["if", ["not", ["=", ["count", "a"], ["count", "b"]]],
6 false,
7 ["if", ["empty?", "a"],
8 true,
9 ["if", ["equal?", ["get", "a", 0], ["get", "b", 0]],
10 ["_cmp_seqs", ["rest", "a"], ["rest", "b"]],
11 false]]]]],
12
13 ["def", "_check_hash_map_keys", ["fn", ["ks", "a", "b"],
14 ["if", ["empty?", "ks"],
15 true,
16 ["let", ["k", ["first", "ks"]],
17 ["if", ["equal?", ["get", "a", "k"], ["get", "b", "k"]],
18 ["_check_hash_map_keys", ["rest", "ks"], "a", "b"],
19 false]]]]],
20 ["def", "_cmp_hash_maps", ["fn", ["a", "b"],
21 ["let", ["aks", ["keys", "a"]],
22 ["if", ["not", ["=", ["count", "aks"], ["count", ["keys", "b"]]]],
23 false,
24 ["_check_hash_map_keys", "aks", "a", "b"]]]]],
25
26 ["def", "equal?", ["fn", ["a", "b"],
27 ["if", ["sequential?", "a"],
28 ["if", ["sequential?", "b"],
29 ["_cmp_seqs", "a", "b"],
30 false],
31 ["if", ["map?", "a"],
32 ["if", ["map?", "b"],
33 ["_cmp_hash_maps", "a", "b"],
34 false],
35 ["if", ["symbol?", "a"],
36 ["if", ["symbol?", "b"],
37 ["=", ["get", "a", ["`", "val"]], ["get", "b", ["`", "val"]]],
38 false],
39 ["=", "a", "b"]]]]]],
40
41 ["def", "_clone", ["fn", ["obj"],
42 ["if", ["list?", "obj"],
43 ["slice", "obj", 0],
44 ["if", ["vector?", "obj"],
45 ["let", ["new-obj", ["slice", "obj", 0]],
46 ["do",
47 ["set", "new-obj", ["`", "__vector?__"], true],
48 "new-obj"]],
49 ["if", ["map?", "obj"],
50 ["let", ["new-obj", ["hash-map"]],
51 ["do",
52 ["map", ["fn", ["k"],
53 ["if", [".", "obj", ["`", "hasOwnProperty"], "k"],
54 ["set", "new-obj", "k", ["get", "obj", "k"]],
55 null]],
56 ["keys", "obj"]],
57 "new-obj"]],
58 ["if", ["malfunc?", "obj"],
59 ["let", ["new-obj", ["malfunc", ["get", "obj", ["`", "fn"]],
60 ["get", "obj", ["`", "ast"]],
61 ["get", "obj", ["`", "env"]],
62 ["get", "obj", ["`", "params"]]]],
63 ["do",
64 ["set", "new-obj", ["`", "macro?"], ["get", "obj", ["`", "macro?"]]],
65 ["set", "new-obj", ["`", "__meta__"], ["get", "obj", ["`", "__meta__"]]],
66 "new-obj"]],
67 ["throw", "clone of unsupported type"]]]]]]],
68
69 ["def", "clone", ["fn", ["obj"],
70 ["let", ["new-obj", ["_clone", "obj"]],
71 ["do",
72 [".", "Object", ["`", "defineProperty"], "new-obj", ["`", "__meta__"],
73 {"enumerable": false, "writable": true}],
74 "new-obj"]]]],
75
76 ["def", "assoc!", ["fn", ["a", "b", "c"], ["do", ["set", "a", "b", "c"], "a"]]],
77 ["def", "assocs!", ["fn", ["hm", "kvs"],
78 ["if", ["empty?", "kvs"],
79 "hm",
80 ["do",
81 ["assoc!", "hm", ["get", "kvs", 0], ["get", "kvs", 1]],
82 ["assocs!", "hm", ["slice", "kvs", 2]]]]]],
83
84
85 ["def", "Symbol", ["fn", [], null]],
86 ["def", "symbol", ["fn", ["name"],
87 ["assoc!", ["new", "Symbol"], ["`", "val"], "name"]]],
88
89 ["def", "symbol?", ["fn", ["a"],
90 ["isa", "a", "Symbol"]]],
91
92
93 ["def", "keyword", ["fn", ["name"],
94 ["str", ["`", "\u029e"], "name"]]],
95
96 ["def", "keyword?", ["fn", ["kw"],
97 ["and", ["=", ["`", "[object String]"], ["classOf", "kw"]],
98 ["=", ["`", "\u029e"], ["get", "kw", 0]]]]],
99
100
101 ["`", "Override some list defs to account for Vectors"],
102 ["def", "sequential?", ["fn", ["a"],
103 [".", "Array", ["`", "isArray"], "a"]]],
104
105 ["def", "list?", ["fn", ["a"],
106 ["if", [".", "Array", ["`", "isArray"], "a"],
107 ["if", [".-", "a", ["`", "__vector?__"]],
108 false,
109 true],
110 false]]],
111
112 ["def", "empty?", ["fn", ["a"],
113 ["if", ["sequential?", "a"],
114 ["if", ["=", 0, [".-", "a", ["`", "length"]]],
115 true,
116 false],
117 ["=", "a", null]]]],
118
119
120 ["def", "vectorl", ["fn", ["lst"],
121 ["let", ["vec", ["slice", "lst", 0]],
122 ["do",
123 ["set", "vec", ["`", "__vector?__"], true],
124 "vec"]]]],
125
126 ["def", "vector", ["fn", ["&", "args"], ["vectorl", "args"]]],
127
128 ["def", "vector?", ["fn", ["a"],
129 ["if", [".", "Array", ["`", "isArray"], "a"],
130 ["if", [".-", "a", ["`", "__vector?__"]],
131 true,
132 false],
133 false]]],
134
135
136 ["def", "HashMap", ["fn", [], null]],
137 ["def", "hash-map", ["fn", ["&", "a"],
138 ["assocs!", ["new", "HashMap"], "a"]]],
139 ["def", "map?", ["fn", ["a"],
140 ["isa", "a", "HashMap"]]],
141
142 ["def", "MalFunc", ["fn", [], null]],
143 ["def", "malfunc", ["fn", ["fn", "ast", "env", "params"],
144 ["assocs!", ["new", "MalFunc"],
145 ["list", ["`", "fn"], "fn",
146 ["`", "ast"], "ast",
147 ["`", "env"], "env",
148 ["`", "params"], "params",
149 ["`", "macro?"], false]]]],
150
151 ["def", "malfunc?", ["fn", ["a"],
152 ["isa", "a", "MalFunc"]]],
153
154 ["def", "Atom", ["fn", [], null]],
155 ["def", "atom", ["fn", ["a"],
156 ["let", ["atm", ["new", "Atom"]],
157 ["do",
158 ["set", "atm", ["`", "val"], "a"],
159 "atm"]]]],
160 ["def", "atom?", ["fn", ["a"],
161 ["isa", "a", "Atom"]]],
162
163 null
164 ]