mix-language 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var NUMBER =
6
+ {
7
+ functions: {}
8
+ };
9
+
10
+ copy_functions(NUMBER, OBJECT);
11
+
12
+ function new_number (value)
13
+ {
14
+ var number =
15
+ {
16
+ object_type: NUMBER_TYPE,
17
+ functions: {},
18
+ data: {},
19
+ keys: [],
20
+ unknown: Object_bad_key,
21
+ value: value
22
+ };
23
+
24
+ copy_functions(number, NUMBER);
25
+
26
+ return number;
27
+ }
28
+
29
+ function cmp_number (a, b)
30
+ {
31
+ return (a === b) ? 0 : (a > b) ? 1 : -1;
32
+ }
33
+
34
+ function Number_div (self, args)
35
+ {
36
+ var num = args[0];
37
+
38
+ if (xself(self, NUMBER_TYPE, "#div") || xarg(num, NUMBER_TYPE, "Number#div", "number"))
39
+ {
40
+ return NULL;
41
+ }
42
+
43
+ return new_number(self.value / num.value);
44
+ }
45
+
46
+ function Number_gt (self, args)
47
+ {
48
+ var num = args[0];
49
+
50
+ if (xself(self, NUMBER_TYPE, "#gt") || xarg(num, NUMBER_TYPE, "Number#gt", "number"))
51
+ {
52
+ return NULL;
53
+ }
54
+
55
+ var a = self.value;
56
+ var b = num.value;
57
+
58
+ return (cmp_number(a, b) === 1) ? TRUE : FALSE;
59
+ }
60
+
61
+ function Number_gteq (self, args)
62
+ {
63
+ var num = args[0];
64
+
65
+ if (xself(self, NUMBER_TYPE, "#gteq") || xarg(num, NUMBER_TYPE, "Number#gteq", "number"))
66
+ {
67
+ return NULL;
68
+ }
69
+
70
+ var a = self.value;
71
+ var b = num.value;
72
+
73
+ return (cmp_number(a, b) !== -1) ? TRUE : FALSE;
74
+ }
75
+
76
+ function Number_lt (self, args)
77
+ {
78
+ var num = args[0];
79
+
80
+ if (xself(self, NUMBER_TYPE, "#lt") || xarg(num, NUMBER_TYPE, "Number#lt", "number"))
81
+ {
82
+ return NULL;
83
+ }
84
+
85
+ var a = self.value;
86
+ var b = num.value;
87
+
88
+ return (cmp_number(a, b) === -1) ? TRUE : FALSE;
89
+ }
90
+
91
+ function Number_lteq (self, args)
92
+ {
93
+ var num = args[0];
94
+
95
+ if (xself(self, NUMBER_TYPE, "#lteq") || xarg(num, NUMBER_TYPE, "Number#lteq", "number"))
96
+ {
97
+ return NULL;
98
+ }
99
+
100
+ var a = self.value;
101
+ var b = num.value;
102
+
103
+ return (cmp_number(a, b) !== 1) ? TRUE : FALSE;
104
+ }
105
+
106
+ function Number_minus (self, args)
107
+ {
108
+ var num = args[0];
109
+
110
+ if (xself(self, NUMBER_TYPE, "#minus") || xarg(num, NUMBER_TYPE, "Number#minus", "number"))
111
+ {
112
+ return NULL;
113
+ }
114
+
115
+ return new_number(self.value - num.value);
116
+ }
117
+
118
+ function Number_mod (self, args)
119
+ {
120
+ var num = args[0];
121
+
122
+ if (xself(self, NUMBER_TYPE, "#mod") || xarg(num, NUMBER_TYPE, "Number#mod", "number"))
123
+ {
124
+ return NULL;
125
+ }
126
+
127
+ return new_number(self.value % num.value);
128
+ }
129
+
130
+ function Number_plus (self, args)
131
+ {
132
+ var num = args[0];
133
+
134
+ if (xself(self, NUMBER_TYPE, "#plus") || xarg(num, NUMBER_TYPE, "Number#plus", "number"))
135
+ {
136
+ return NULL;
137
+ }
138
+
139
+ return new_number(self.value + num.value);
140
+ }
141
+
142
+ function Number_mul (self, args)
143
+ {
144
+ var num = args[0];
145
+
146
+ if (xself(self, NUMBER_TYPE, "#mul") || xarg(num, NUMBER_TYPE, "Number#mul", "number"))
147
+ {
148
+ return NULL;
149
+ }
150
+
151
+ return new_number(self.value * num.value);
152
+ }
153
+
154
+ function Number_stringify (self, args)
155
+ {
156
+ if (xself(self, NUMBER_TYPE, "#stringify"))
157
+ {
158
+ return NULL;
159
+ }
160
+
161
+ return new_string('' + self.value);
162
+ }
163
+
164
+ function Number_times (self, args)
165
+ {
166
+ var func = args[0];
167
+
168
+ if (xself(self, NUMBER_TYPE, "#times") || xarg(func, FUNCTION_TYPE, "Number#times", "function"))
169
+ {
170
+ return self;
171
+ }
172
+
173
+ var n = self.value;
174
+ var body = func.value;
175
+ var bound = func.bound;
176
+
177
+ for (var i = 0; i < n; ++i)
178
+ {
179
+ ITERATING += 1;
180
+ body(bound, [new_number(i)]);
181
+ ITERATING -= 1;
182
+
183
+ if (BREAK_VALUE)
184
+ {
185
+ var result = BREAK_VALUE;
186
+
187
+ BREAK_VALUE = null;
188
+ return result;
189
+ }
190
+ else if (RETURN_VALUE)
191
+ {
192
+ RETURN_VALUE = null;
193
+ }
194
+ }
195
+
196
+ return self;
197
+ }
198
+
199
+ function Number_upto (self, args)
200
+ {
201
+ var num = args[0];
202
+ var func = args[1];
203
+
204
+ if (xself(self, NUMBER_TYPE, "#upto") || xarg(num, NUMBER_TYPE, "Number#upto", "number") || xarg(func, FUNCTION_TYPE, "Number#upto", "function"))
205
+ {
206
+ return self;
207
+ }
208
+
209
+ var start = self.value;
210
+ var end = num.value;
211
+ var body = func.value;
212
+ var bound = func.bound;
213
+
214
+ for (var i = start; i <= end; ++i)
215
+ {
216
+ ITERATING += 1;
217
+ body(bound, [new_number(i)]);
218
+ ITERATING -= 1;
219
+
220
+ if (BREAK_VALUE)
221
+ {
222
+ var result = BREAK_VALUE;
223
+
224
+ BREAK_VALUE = null;
225
+ return result;
226
+ }
227
+ else if (RETURN_VALUE)
228
+ {
229
+ RETURN_VALUE = null;
230
+ }
231
+ }
232
+
233
+ return self;
234
+ }
235
+
236
+ add_function(NUMBER, 'div', Number_div, ['number']);
237
+ add_function(NUMBER, 'inspect', Number_stringify, []);
238
+ add_function(NUMBER, 'gt', Number_gt, ['number']);
239
+ add_function(NUMBER, 'gteq', Number_gteq, ['number']);
240
+ add_function(NUMBER, 'lt', Number_lt, ['number']);
241
+ add_function(NUMBER, 'lteq', Number_lteq, ['number']);
242
+ add_function(NUMBER, 'minus', Number_minus, ['number']);
243
+ add_function(NUMBER, 'mod', Number_mod, ['number']);
244
+ add_function(NUMBER, 'mul', Number_mul, ['number']);
245
+ add_function(NUMBER, 'percent', Number_mod, ['number']);
246
+ add_function(NUMBER, 'plus', Number_plus, ['number']);
247
+ add_function(NUMBER, 'slash', Number_div, ['number']);
248
+ add_function(NUMBER, 'star', Number_mul, ['number']);
249
+ add_function(NUMBER, 'stringify', Number_stringify, []);
250
+ add_function(NUMBER, 'times', Number_times, ['function']);
251
+ add_function(NUMBER, 'upto', Number_upto, ['number','function']);
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var OBJECT =
6
+ {
7
+ functions: {}
8
+ };
9
+
10
+ function new_object (fields, keys)
11
+ {
12
+ var obj =
13
+ {
14
+ object_type: OBJECT_TYPE,
15
+ functions: {},
16
+ data: fields,
17
+ keys: keys,
18
+ unknown: Object_bad_key,
19
+ value: {}
20
+ };
21
+
22
+ copy_functions(obj, OBJECT);
23
+
24
+ return obj;
25
+ }
26
+
27
+ function Object_alert (self, args)
28
+ {
29
+ var str = call_function(self, 'stringify', []);
30
+
31
+ alert(str.value);
32
+
33
+ return self;
34
+ }
35
+
36
+ function Object_bad_key (self, args)
37
+ {
38
+ var str = args[0];
39
+
40
+ xarg(str, STRING_TYPE, "#get", "string");
41
+ return NULL;
42
+ }
43
+
44
+ function Object_cancel (self, args)
45
+ {
46
+ var ids = self.timeout_ids;
47
+
48
+ if (ids)
49
+ {
50
+ for (var i = 0, l = ids.length; i < l; ++i)
51
+ {
52
+ clearTimeout(ids[i]);
53
+ }
54
+
55
+ delete self.timeout_ids;
56
+ }
57
+
58
+ return self;
59
+ }
60
+
61
+ function Object_eq (self, args)
62
+ {
63
+ var obj = args[0];
64
+
65
+ if (xarg(obj, null, "#eq", "an"))
66
+ {
67
+ return NULL;
68
+ }
69
+
70
+ if (obj.object_type !== self.object_type)
71
+ {
72
+ return FALSE;
73
+ }
74
+
75
+ return (self.value === obj.value) ? TRUE : FALSE;
76
+ }
77
+
78
+ function Object_every (self, args)
79
+ {
80
+ var num = args[0];
81
+ var func = args[1];
82
+
83
+ if (xarg(num, NUMBER_TYPE, "#every", "number") || xarg(func, FUNCTION_TYPE, "#every", "function"))
84
+ {
85
+ return self;
86
+ }
87
+
88
+ var body = func.value;
89
+ var bound = func.bound;
90
+ var t = num.value;
91
+
92
+ if (!self.interval_ids)
93
+ {
94
+ self.interval_ids = [];
95
+ }
96
+
97
+ self.interval_ids.push(setInterval(function () { body(bound, [self]) }, t));
98
+
99
+ return self;
100
+ }
101
+
102
+ function Object_fnames (self, args)
103
+ {
104
+ var fnames = [];
105
+
106
+ for (var fname in self.functions)
107
+ {
108
+ fnames.push(new_string(fname));
109
+ }
110
+
111
+ return new_array(fnames.sort());
112
+ }
113
+
114
+ function Object_get (self, args)
115
+ {
116
+ var str = args[0];
117
+
118
+ if (xarg(str, STRING_TYPE, "#get", "string"))
119
+ {
120
+ return NULL;
121
+ }
122
+
123
+ var key = str.value;
124
+ var fields = self.data;
125
+
126
+ return fields[key] || self.unknown(self, [key]);
127
+ }
128
+
129
+ function Object_inspect (self, args)
130
+ {
131
+ return new_string('{...}');
132
+ }
133
+
134
+ function Object_log (self, args)
135
+ {
136
+ output(self);
137
+ return self;
138
+ }
139
+
140
+ function Object_neq (self, args)
141
+ {
142
+ var obj = args[0];
143
+
144
+ if (xarg(obj, null, "#neq", "an"))
145
+ {
146
+ return NULL;
147
+ }
148
+
149
+ if (obj.object_type !== self.object_type)
150
+ {
151
+ return TRUE;
152
+ }
153
+
154
+ return (self.value === obj.value) ? FALSE : TRUE;
155
+ }
156
+
157
+ function Object_print (self, args)
158
+ {
159
+ var str = call_function(self, 'stringify', []);
160
+
161
+ output(str.value);
162
+
163
+ return self;
164
+ }
165
+
166
+ function Object_scope (self, args)
167
+ {
168
+ var func = args[0];
169
+
170
+ if (xarg(func, FUNCTION_TYPE, "#scope", "function"))
171
+ {
172
+ return self;
173
+ }
174
+
175
+ func.value(self, []);
176
+
177
+ return self;
178
+ }
179
+
180
+ function Object_set (self, args)
181
+ {
182
+ var str = args[0];
183
+ var obj = args[1];
184
+
185
+ if (xarg(obj, null, "#set", "right hand"))
186
+ {
187
+ return NULL;
188
+ }
189
+
190
+ if (xarg(str, STRING_TYPE, "#set", "string key"))
191
+ {
192
+ return obj;
193
+ }
194
+
195
+ var key = str.value;
196
+
197
+ if (!self.data[key])
198
+ {
199
+ self.keys.push(key);
200
+ }
201
+
202
+ return self.data[key] = value;
203
+ }
204
+
205
+ function Object_stop (self, args)
206
+ {
207
+ var ids = self.interval_ids;
208
+
209
+ if (ids)
210
+ {
211
+ for (var i = 0, l = ids.length; i < l; ++i)
212
+ {
213
+ clearInterval(ids[i]);
214
+ }
215
+
216
+ delete self.interval_ids;
217
+ }
218
+
219
+ return self;
220
+ }
221
+
222
+ function Object_stringify (self, args)
223
+ {
224
+ var string = '';
225
+ var fields = self.data;
226
+ var keys = self.keys;
227
+
228
+ for (var k, i = 0, l = keys.length; i < l; ++i)
229
+ {
230
+ k = keys[i];
231
+
232
+ string += k + ':';
233
+ string += ' ' + call_function(fields[k], 'inspect', []).value;
234
+
235
+ if (i < l - 1)
236
+ {
237
+ string += ',' + ' ';
238
+ }
239
+ }
240
+
241
+ return new_string('{' + string + '}');
242
+ }
243
+
244
+ function Object_use (self, args)
245
+ {
246
+ var func = args[0];
247
+
248
+ if (xarg(func, FUNCTION_TYPE, "#use", "function"))
249
+ {
250
+ return self;
251
+ }
252
+
253
+ func.value(func.bound, [self]);
254
+
255
+ return self;
256
+ }
257
+
258
+ function Object_wait (self, args)
259
+ {
260
+ var num = args[0];
261
+ var func = args[1];
262
+
263
+ if (xarg(num, NUMBER_TYPE, "#wait", "number") || xarg(func, FUNCTION_TYPE, "#wait", "function"))
264
+ {
265
+ return self;
266
+ }
267
+
268
+ var body = func.value;
269
+ var bound = func.bound;
270
+ var t = num.value;
271
+
272
+ if (!self.timeout_ids)
273
+ {
274
+ self.timeout_ids = [];
275
+ }
276
+
277
+ self.timeout_ids.push(setTimeout(function () { body(bound, [self]); }, t));
278
+
279
+ return self;
280
+ }
281
+
282
+ add_function(OBJECT, 'alert', Object_alert, []);
283
+ add_function(OBJECT, 'brackets', Object_get, ['key']);
284
+ add_function(OBJECT, 'brackets_eq', Object_set, ['key','value']);
285
+ add_function(OBJECT, 'cancel', Object_cancel, []);
286
+ add_function(OBJECT, 'eq', Object_eq, ['object']);
287
+ add_function(OBJECT, 'every', Object_every, ['milliseconds','function']);
288
+ add_function(OBJECT, 'fnames', Object_fnames, []);
289
+ add_function(OBJECT, 'get', Object_get, ['key']);
290
+ add_function(OBJECT, 'inspect', Object_inspect, []);
291
+ add_function(OBJECT, 'log', Object_log, []);
292
+ add_function(OBJECT, 'neq', Object_neq, ['object']);
293
+ add_function(OBJECT, 'print', Object_print, []);
294
+ add_function(OBJECT, 'scope', Object_scope, ['function']);
295
+ add_function(OBJECT, 'set', Object_set, ['key','value']);
296
+ add_function(OBJECT, 'stop', Object_stop, []);
297
+ add_function(OBJECT, 'stringify', Object_stringify, []);
298
+ add_function(OBJECT, 'use', Object_use, ['function']);
299
+ add_function(OBJECT, 'wait', Object_wait, ['milliseconds','function']);
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var STRING =
6
+ {
7
+ functions: {}
8
+ };
9
+
10
+ copy_functions(STRING, OBJECT);
11
+
12
+ function new_string (value)
13
+ {
14
+ var str =
15
+ {
16
+ object_type: STRING_TYPE,
17
+ functions: {},
18
+ data: {},
19
+ keys: [],
20
+ unknown: Object_bad_key,
21
+ value: value
22
+ };
23
+
24
+ copy_functions(str, STRING);
25
+
26
+ return str;
27
+ }
28
+
29
+ function String_inspect (self, args)
30
+ {
31
+ if (xself(self, STRING_TYPE, "#inspect"))
32
+ {
33
+ return NULL;
34
+ }
35
+
36
+ return new_string("'" + self.value + "'");
37
+ }
38
+
39
+ function String_plus (self, args)
40
+ {
41
+ var str = args[0];
42
+
43
+ if (xself(self, STRING_TYPE, "#plus") || xarg(str, STRING_TYPE, "String#plus", "string"))
44
+ {
45
+ return NULL;
46
+ }
47
+
48
+ return new_string(self.value + str.value);
49
+ }
50
+
51
+ function String_stringify (self, args)
52
+ {
53
+ if (xself(self, STRING_TYPE, "#stringify"))
54
+ {
55
+ return NULL;
56
+ }
57
+
58
+ return new_string(self.value);
59
+ }
60
+
61
+ function String_warn (self, args)
62
+ {
63
+ if (xself(self, STRING_TYPE, "#warn"))
64
+ {
65
+ return self;
66
+ }
67
+
68
+ warn(self.value);
69
+ return self;
70
+ }
71
+
72
+ add_function(STRING, 'inspect', String_inspect, []);
73
+ add_function(STRING, 'plus', String_plus, []);
74
+ add_function(STRING, 'inspect', String_stringify, []);
75
+ add_function(STRING, 'warn', String_warn, []);
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var TRUE =
6
+ {
7
+ object_type: TRUE_TYPE,
8
+ functions: {},
9
+ data: {},
10
+ keys: [],
11
+ unknown: Object_bad_key,
12
+ value: true
13
+ }
14
+
15
+ copy_functions(TRUE, OBJECT);
16
+
17
+ function True_stringify (self, args)
18
+ {
19
+ return new_string('true');
20
+ }
21
+
22
+ add_function(TRUE, 'inspect', True_stringify, []);
23
+ add_function(TRUE, 'stringify', True_stringify, []);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var DIV =
6
+ {
7
+ functions: {},
8
+ tag_name: 'div'
9
+ };
10
+
11
+ HTML_TYPES['Div'] = DIV;