sibilant 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -4
- data/js/sibilant/.gitignore +4 -0
- data/js/sibilant/.travis.yml +6 -0
- data/js/sibilant/LICENSE +20 -0
- data/js/sibilant/README.md +70 -0
- data/js/sibilant/bin/sibilant +3 -0
- data/js/sibilant/cli-help +79 -0
- data/js/sibilant/include/functional.sibilant +57 -0
- data/js/sibilant/include/macros.sibilant +374 -0
- data/js/sibilant/include/node.sibilant +2 -0
- data/js/sibilant/lib/browser.js +685 -0
- data/js/sibilant/lib/cli.js +153 -0
- data/js/sibilant/lib/options.js +232 -0
- data/js/sibilant/lib/repl.js +78 -0
- data/js/sibilant/lib/sibilant.js +688 -0
- data/js/sibilant/misc/sibilant-mode.el +129 -0
- data/js/sibilant/package.json +19 -0
- data/js/sibilant/package.sibilant +16 -0
- data/js/sibilant/public/index.html +502 -0
- data/js/sibilant/public/javascripts/browser.js +685 -0
- data/js/sibilant/public/javascripts/jquery-ui.js +392 -0
- data/js/sibilant/public/javascripts/jquery.js +154 -0
- data/js/sibilant/public/javascripts/macros.sibilant +374 -0
- data/js/sibilant/public/javascripts/sibilant.info.sibilant +77 -0
- data/js/sibilant/public/sass/_mixins.sass +98 -0
- data/js/sibilant/public/sass/sibilant.sass +156 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.eot +0 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.svg +241 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.ttf +0 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.woff +0 -0
- data/js/sibilant/public/stylesheets/sibilant.css +166 -0
- data/js/sibilant/src/browser.sibilant +45 -0
- data/js/sibilant/src/cli.sibilant +93 -0
- data/js/sibilant/src/core.sibilant +338 -0
- data/js/sibilant/src/options.sibilant +65 -0
- data/js/sibilant/src/repl.sibilant +59 -0
- data/js/sibilant/src/sibilant.sibilant +78 -0
- data/js/sibilant/test/defvar.sibilant +5 -0
- data/js/sibilant/test/includeFile1.sibilant +1 -0
- data/js/sibilant/test/includeFile2.sibilant +1 -0
- data/js/sibilant/test/node.sibilant +10 -0
- data/js/sibilant/test/slice.sibilant +3 -0
- data/js/sibilant/test/test.sibilant +464 -0
- data/js/sibilant/test/testHelper.sibilant +80 -0
- data/lib/sibilant/version.rb +1 -1
- data/sibilant.gemspec +3 -1
- metadata +44 -1
@@ -0,0 +1,688 @@
|
|
1
|
+
var sibilant = exports,
|
2
|
+
util = require("util"),
|
3
|
+
path = require("path"),
|
4
|
+
fs = require("fs"),
|
5
|
+
error = (function(str) {
|
6
|
+
// str:required
|
7
|
+
throw new Error (str);
|
8
|
+
}),
|
9
|
+
inspect = util.inspect;
|
10
|
+
var bulkMap = (function(arr, fn) {
|
11
|
+
// arr:required fn:required
|
12
|
+
var index = 0,
|
13
|
+
groupSize = fn.length,
|
14
|
+
retArr = [ ];
|
15
|
+
(function() {
|
16
|
+
var __returnValue__ = undefined;
|
17
|
+
while ((index < arr.length)) {
|
18
|
+
__returnValue__ = (function() {
|
19
|
+
retArr.push(fn.apply(undefined, arr.slice(index, (index + groupSize))));
|
20
|
+
return index += groupSize;
|
21
|
+
})();
|
22
|
+
};
|
23
|
+
return __returnValue__;
|
24
|
+
})();
|
25
|
+
return retArr;
|
26
|
+
});
|
27
|
+
|
28
|
+
var inject = (function(start, items, fn) {
|
29
|
+
// start:required items:required fn:required
|
30
|
+
var value = start;
|
31
|
+
(function() {
|
32
|
+
if ((items) && (items).constructor.name === "Array") {
|
33
|
+
return items.forEach((function(item, index) {
|
34
|
+
// item:required index:required
|
35
|
+
return value = fn(value, item, index);
|
36
|
+
}));
|
37
|
+
}
|
38
|
+
})();
|
39
|
+
return value;
|
40
|
+
});
|
41
|
+
|
42
|
+
var map = (function(items, fn) {
|
43
|
+
// items:required fn:required
|
44
|
+
return inject([ ], items, (function(collector, item, index) {
|
45
|
+
// collector:required item:required index:required
|
46
|
+
collector.push(fn(item, index));
|
47
|
+
return collector;
|
48
|
+
}));
|
49
|
+
});
|
50
|
+
|
51
|
+
var select = (function(items, fn) {
|
52
|
+
// items:required fn:required
|
53
|
+
return inject([ ], items, (function(collector, item, index) {
|
54
|
+
// collector:required item:required index:required
|
55
|
+
(function() {
|
56
|
+
if (fn(item, index)) {
|
57
|
+
return collector.push(item);
|
58
|
+
}
|
59
|
+
})();
|
60
|
+
return collector;
|
61
|
+
}));
|
62
|
+
});
|
63
|
+
|
64
|
+
var detect = (function(items, fn) {
|
65
|
+
// items:required fn:required
|
66
|
+
var returnItem = undefined,
|
67
|
+
index = 0,
|
68
|
+
items = items;
|
69
|
+
return (function() {
|
70
|
+
var __returnValue__ = undefined;
|
71
|
+
while ((!((items.length === index) || returnItem))) {
|
72
|
+
__returnValue__ = (function() {
|
73
|
+
(function() {
|
74
|
+
if (fn((items)[index], index)) {
|
75
|
+
return returnItem = (items)[index];
|
76
|
+
}
|
77
|
+
})();
|
78
|
+
return ((index)++);
|
79
|
+
})();
|
80
|
+
};
|
81
|
+
return __returnValue__;
|
82
|
+
})();
|
83
|
+
});
|
84
|
+
|
85
|
+
var reject = (function(items, fn) {
|
86
|
+
// items:required fn:required
|
87
|
+
var args = [ items, fn ];
|
88
|
+
return select(items, (function() {
|
89
|
+
return (!fn.apply(undefined, arguments));
|
90
|
+
}));
|
91
|
+
});
|
92
|
+
|
93
|
+
var compact = (function(arr) {
|
94
|
+
// arr:required
|
95
|
+
return select(arr, (function(item) {
|
96
|
+
// item:required
|
97
|
+
return (!!(item));
|
98
|
+
}));
|
99
|
+
});
|
100
|
+
|
101
|
+
var flatten = (function(items) {
|
102
|
+
// items:rest
|
103
|
+
var items = Array.prototype.slice.call(arguments, 0);
|
104
|
+
|
105
|
+
return inject([ ], items, (function(collector, item) {
|
106
|
+
// collector:required item:required
|
107
|
+
return collector.concat((function() {
|
108
|
+
if ((item) && (item).constructor.name === "Array") {
|
109
|
+
return flatten.apply(undefined, item);
|
110
|
+
} else {
|
111
|
+
return item;
|
112
|
+
}
|
113
|
+
})());
|
114
|
+
}));
|
115
|
+
});
|
116
|
+
|
117
|
+
|
118
|
+
sibilant.packageInfo = (function() {
|
119
|
+
var fs = require("fs");
|
120
|
+
return JSON.parse(fs.readFileSync((__dirname + "/../package.json")));
|
121
|
+
});
|
122
|
+
|
123
|
+
sibilant.versionString = (function() {
|
124
|
+
var package = sibilant.packageInfo(),
|
125
|
+
path = require("path");
|
126
|
+
return (package.name + " version " + package.version + "\n(at " + path.join(__dirname, "..") + ")");
|
127
|
+
});
|
128
|
+
|
129
|
+
sibilant.stripShebang = (function(data) {
|
130
|
+
// data:required
|
131
|
+
return data.replace(/^#!.*\n/, "");
|
132
|
+
});
|
133
|
+
|
134
|
+
(sibilant)["file"] = "eval.sibilant";
|
135
|
+
(sibilant)["dir"] = process.cwd();
|
136
|
+
var withDirAndFile = (function(dir, file, fn) {
|
137
|
+
// dir:required file:required fn:required
|
138
|
+
var before = {
|
139
|
+
dir: sibilant.dir,
|
140
|
+
file: sibilant.file
|
141
|
+
};
|
142
|
+
(sibilant)["dir"] = dir;
|
143
|
+
(sibilant)["file"] = file;
|
144
|
+
var retval = fn();
|
145
|
+
(sibilant)["dir"] = before.dir;
|
146
|
+
(sibilant)["file"] = before.file;
|
147
|
+
return retval;
|
148
|
+
});
|
149
|
+
|
150
|
+
sibilant.translateFile = (function(fileName) {
|
151
|
+
// fileName:required
|
152
|
+
return withDirAndFile(path.dirname(fileName), fileName, (function() {
|
153
|
+
return sibilant.translateAll(sibilant.stripShebang(fs.readFileSync(fileName, "utf8")));
|
154
|
+
}));
|
155
|
+
});
|
156
|
+
|
157
|
+
sibilant.version = (function() {
|
158
|
+
return (sibilant.packageInfo())["version"];
|
159
|
+
});
|
160
|
+
|
161
|
+
(require.extensions)[".sibilant"] = (function(module, filename) {
|
162
|
+
// module:required filename:required
|
163
|
+
var content = sibilant.translateFile(filename);
|
164
|
+
return module._compile(content, filename);
|
165
|
+
});
|
166
|
+
sibilant.include = (function(file) {
|
167
|
+
// file:required
|
168
|
+
(function() {
|
169
|
+
if ((!file.match((new RegExp(".sibilant$", undefined))))) {
|
170
|
+
return file = (file + ".sibilant");
|
171
|
+
}
|
172
|
+
})();
|
173
|
+
(function() {
|
174
|
+
if (file.match((new RegExp("^\.\.?/", undefined)))) {
|
175
|
+
return file = (sibilant.dir + "/" + file);
|
176
|
+
}
|
177
|
+
})();
|
178
|
+
var resolved = require.resolve(file);
|
179
|
+
return sibilant.translateFile(resolved);
|
180
|
+
});
|
181
|
+
|
182
|
+
(sibilant)["tokens"] = { };
|
183
|
+
(sibilant.tokens)["regex"] = "(\\/(\\\\\\\/|[^\\/\\n])+\\/[glim]*)";
|
184
|
+
(sibilant.tokens)["comment"] = "(;.*)";
|
185
|
+
(sibilant.tokens)["string"] = "(\"(([^\"]|(\\\\\"))*[^\\\\])?\")";
|
186
|
+
(sibilant.tokens)["number"] = "(-?[0-9][0-9.,]*)";
|
187
|
+
(sibilant.tokens)["literal"] = "(-?[*.$a-zA-Z][*.a-zA-Z0-9-]*(\\?|!)?)";
|
188
|
+
(sibilant.tokens)["special"] = "([&']?)";
|
189
|
+
(sibilant.tokens)["otherChar"] = "([><=!\\+\\/\\*-]+)";
|
190
|
+
(sibilant.tokens)["openParen"] = "(\\()";
|
191
|
+
(sibilant.tokens)["specialOpenParen"] = "('?\\()";
|
192
|
+
(sibilant.tokens)["closeParen"] = "(\\))";
|
193
|
+
(sibilant.tokens)["alternativeParens"] = "\\{|\\[|\\}|\\]";
|
194
|
+
(sibilant.tokens)["specialLiteral"] = (sibilant.tokens.special + sibilant.tokens.literal);
|
195
|
+
(sibilant)["tokenPrecedence"] = [ "regex", "comment", "string", "number", "specialLiteral", "otherChar", "specialOpenParen", "closeParen", "alternativeParens" ];
|
196
|
+
var tokenize = sibilant.tokenize = (function(string) {
|
197
|
+
// string:required
|
198
|
+
var tokens = [ ],
|
199
|
+
parseStack = [ tokens ],
|
200
|
+
specials = [ ];
|
201
|
+
var acceptToken = (function(token) {
|
202
|
+
// token:required
|
203
|
+
return (parseStack)[0].push(token);
|
204
|
+
});
|
205
|
+
;
|
206
|
+
var increaseNesting = (function() {
|
207
|
+
var newArr = [ ];
|
208
|
+
acceptToken(newArr);
|
209
|
+
return parseStack.unshift(newArr);
|
210
|
+
});
|
211
|
+
;
|
212
|
+
var decreaseNesting = (function() {
|
213
|
+
specials.shift();
|
214
|
+
parseStack.shift();
|
215
|
+
return (function() {
|
216
|
+
if ((parseStack.length === 0)) {
|
217
|
+
throw new Error (("unbalanced parens:\n" + inspect(parseStack)));
|
218
|
+
}
|
219
|
+
})();
|
220
|
+
});
|
221
|
+
;
|
222
|
+
var handleToken = (function(token) {
|
223
|
+
// token:required
|
224
|
+
var special = (token)[0],
|
225
|
+
token = token;
|
226
|
+
(function() {
|
227
|
+
if ((special === "'")) {
|
228
|
+
token = token.slice(1);
|
229
|
+
increaseNesting();
|
230
|
+
return acceptToken("quote");
|
231
|
+
} else {
|
232
|
+
return special = false;
|
233
|
+
}
|
234
|
+
})();
|
235
|
+
specials.unshift((!!(special)));
|
236
|
+
(function() {
|
237
|
+
switch(token) {
|
238
|
+
case "(":
|
239
|
+
return increaseNesting();
|
240
|
+
|
241
|
+
case "]":
|
242
|
+
case "}":
|
243
|
+
case ")":
|
244
|
+
return decreaseNesting();
|
245
|
+
|
246
|
+
case "{":
|
247
|
+
increaseNesting();
|
248
|
+
return acceptToken("hash");
|
249
|
+
|
250
|
+
case "[":
|
251
|
+
increaseNesting();
|
252
|
+
return acceptToken("list");
|
253
|
+
|
254
|
+
default:
|
255
|
+
return (function() {
|
256
|
+
if (token.match((new RegExp(("^" + sibilant.tokens.number + "$"), undefined)))) {
|
257
|
+
return acceptToken(parseFloat(token.replace((new RegExp(",", "g")), "")));
|
258
|
+
} else {
|
259
|
+
return acceptToken(token);
|
260
|
+
}
|
261
|
+
})();
|
262
|
+
}
|
263
|
+
})();
|
264
|
+
return (function() {
|
265
|
+
if (((token !== "(") && specials.shift())) {
|
266
|
+
return decreaseNesting();
|
267
|
+
}
|
268
|
+
})();
|
269
|
+
});
|
270
|
+
;
|
271
|
+
var orderedRegexen = map(sibilant.tokenPrecedence, (function(x) {
|
272
|
+
// x:required
|
273
|
+
return (sibilant.tokens)[x];
|
274
|
+
})),
|
275
|
+
masterRegex = (new RegExp((orderedRegexen).join("|"), "g"));
|
276
|
+
string // chain
|
277
|
+
.match(masterRegex)
|
278
|
+
.forEach(handleToken)
|
279
|
+
;
|
280
|
+
(function() {
|
281
|
+
if ((parseStack.length > 1)) {
|
282
|
+
return error("unexpected EOF, probably missing a )\n", inspect((parseStack)[0]));
|
283
|
+
}
|
284
|
+
})();
|
285
|
+
return tokens;
|
286
|
+
});
|
287
|
+
var indent = (function(args) {
|
288
|
+
// args:rest
|
289
|
+
var args = Array.prototype.slice.call(arguments, 0);
|
290
|
+
|
291
|
+
return (compact(args) // chain
|
292
|
+
.join("\n")
|
293
|
+
.replace(/^/, "\n")
|
294
|
+
.replace(/\n/g, "\n ")
|
295
|
+
+ "\n");
|
296
|
+
});
|
297
|
+
|
298
|
+
var constructHash = (function(arrayOfArrays) {
|
299
|
+
// arrayOfArrays:required
|
300
|
+
return inject({ }, arrayOfArrays, (function(object, item) {
|
301
|
+
// object:required item:required
|
302
|
+
(object)[(item)[0]] = (object)[(item)[1]];
|
303
|
+
return object;
|
304
|
+
}));
|
305
|
+
});
|
306
|
+
|
307
|
+
var macros = { };
|
308
|
+
(sibilant)["macros"] = macros;
|
309
|
+
(macros)["return"] = (function(token) {
|
310
|
+
// token:required
|
311
|
+
var defaultReturn = ("return " + translate(token));
|
312
|
+
return (function() {
|
313
|
+
if ((token) && (token).constructor.name === "Array") {
|
314
|
+
return (function() {
|
315
|
+
switch((token)[0]) {
|
316
|
+
case "return":
|
317
|
+
case "throw":
|
318
|
+
case "progn":
|
319
|
+
return translate(token);
|
320
|
+
|
321
|
+
case "delete":
|
322
|
+
var deleteMacro = (macros)["delete"];
|
323
|
+
return (function() {
|
324
|
+
if ((token.length < 3)) {
|
325
|
+
return defaultReturn;
|
326
|
+
} else {
|
327
|
+
return (deleteMacro.apply(undefined, token.slice(1, -1)) + "\nreturn " + deleteMacro((token.slice(-1))[0]));
|
328
|
+
}
|
329
|
+
})();
|
330
|
+
|
331
|
+
case "setf":
|
332
|
+
return (function() {
|
333
|
+
if ((token.length < 4)) {
|
334
|
+
return defaultReturn;
|
335
|
+
} else {
|
336
|
+
return (macros.setf.apply(undefined, token.slice(1, (token.length - 2))) + "\nreturn " + macros.setf.apply(undefined, token.slice(-2)));
|
337
|
+
}
|
338
|
+
})();
|
339
|
+
|
340
|
+
case "set":
|
341
|
+
return (function() {
|
342
|
+
if ((token.length < 5)) {
|
343
|
+
return defaultReturn;
|
344
|
+
} else {
|
345
|
+
var obj = (token)[1],
|
346
|
+
nonReturnPart = token.slice(2, (token.length - 2)),
|
347
|
+
returnPart = token.slice(-2);
|
348
|
+
nonReturnPart.unshift(obj);
|
349
|
+
returnPart.unshift(obj);
|
350
|
+
return (macros.set.apply(undefined, nonReturnPart) + "\nreturn " + macros.set.apply(undefined, returnPart));
|
351
|
+
}
|
352
|
+
})();
|
353
|
+
|
354
|
+
default:
|
355
|
+
return defaultReturn;
|
356
|
+
}
|
357
|
+
})();
|
358
|
+
} else {
|
359
|
+
return defaultReturn;
|
360
|
+
}
|
361
|
+
})();
|
362
|
+
});
|
363
|
+
var asStatement = (function(string) {
|
364
|
+
// string:required
|
365
|
+
return string // chain
|
366
|
+
.toString()
|
367
|
+
.replace(/;*\s*$/, ";")
|
368
|
+
;
|
369
|
+
});
|
370
|
+
|
371
|
+
macros.statement = (function(args) {
|
372
|
+
// args:rest
|
373
|
+
var args = Array.prototype.slice.call(arguments, 0);
|
374
|
+
|
375
|
+
return (macros.call.apply(undefined, args) + ";\n");
|
376
|
+
});
|
377
|
+
|
378
|
+
macros.progn = (function(body) {
|
379
|
+
// body:rest
|
380
|
+
var body = Array.prototype.slice.call(arguments, 0);
|
381
|
+
|
382
|
+
var lastIndex = Math.max(0, (body.length - 1));
|
383
|
+
(body)[lastIndex] = [ "return", (body)[lastIndex] ];
|
384
|
+
return (map(body, (function(arg) {
|
385
|
+
// arg:required
|
386
|
+
return (asStatement(translate(arg)));
|
387
|
+
}))).join("\n");
|
388
|
+
});
|
389
|
+
|
390
|
+
macros.call = (function(fnName, args) {
|
391
|
+
// fnName:required args:rest
|
392
|
+
var args = Array.prototype.slice.call(arguments, 1);
|
393
|
+
|
394
|
+
return (translate(fnName) + "(" + (map(args, translate)).join(", ") + ")");
|
395
|
+
});
|
396
|
+
|
397
|
+
macros.defun = (function(fnName, argsAndBody) {
|
398
|
+
// fnName:required argsAndBody:rest
|
399
|
+
var argsAndBody = Array.prototype.slice.call(arguments, 1);
|
400
|
+
|
401
|
+
var fnNameTr = translate(fnName),
|
402
|
+
start = (function() {
|
403
|
+
if (fnNameTr.match(/\./)) {
|
404
|
+
return "";
|
405
|
+
} else {
|
406
|
+
return "var ";
|
407
|
+
}
|
408
|
+
})();
|
409
|
+
return (start + fnNameTr + " = " + macros.lambda.apply(undefined, argsAndBody) + ";\n");
|
410
|
+
});
|
411
|
+
|
412
|
+
macros.defmacro = (function(name, argsAndBody) {
|
413
|
+
// name:required argsAndBody:rest
|
414
|
+
var argsAndBody = Array.prototype.slice.call(arguments, 1);
|
415
|
+
|
416
|
+
var js = macros.lambda.apply(undefined, argsAndBody),
|
417
|
+
name = translate(name);
|
418
|
+
(function() {
|
419
|
+
try {
|
420
|
+
return (macros)[name] = eval(js);
|
421
|
+
} catch (e) {
|
422
|
+
return error(("error in parsing macro " + name + ":\n" + indent(js)));
|
423
|
+
}
|
424
|
+
})();
|
425
|
+
return undefined;
|
426
|
+
});
|
427
|
+
|
428
|
+
macros.concat = (function(args) {
|
429
|
+
// args:rest
|
430
|
+
var args = Array.prototype.slice.call(arguments, 0);
|
431
|
+
|
432
|
+
return ("(" + (map(args, translate)).join(" + ") + ")");
|
433
|
+
});
|
434
|
+
|
435
|
+
var transformArgs = (function(arglist) {
|
436
|
+
// arglist:required
|
437
|
+
var last = undefined,
|
438
|
+
args = [ ];
|
439
|
+
arglist.forEach((function(arg) {
|
440
|
+
// arg:required
|
441
|
+
return (function() {
|
442
|
+
if (((arg)[0] === "&")) {
|
443
|
+
return last = arg.slice(1);
|
444
|
+
} else {
|
445
|
+
args.push([ (last || "required"), arg ]);
|
446
|
+
return last = null;
|
447
|
+
}
|
448
|
+
})();
|
449
|
+
}));
|
450
|
+
(function() {
|
451
|
+
if (last) {
|
452
|
+
return error(("unexpected argument modifier: " + last));
|
453
|
+
}
|
454
|
+
})();
|
455
|
+
return args;
|
456
|
+
});
|
457
|
+
|
458
|
+
macros.reverse = (function(arr) {
|
459
|
+
// arr:required
|
460
|
+
var reversed = [ ];
|
461
|
+
arr.forEach((function(item) {
|
462
|
+
// item:required
|
463
|
+
return reversed.unshift(item);
|
464
|
+
}));
|
465
|
+
return reversed;
|
466
|
+
});
|
467
|
+
|
468
|
+
var reverse = macros.reverse;
|
469
|
+
var buildArgsString = (function(args, rest) {
|
470
|
+
// args:required rest:required
|
471
|
+
var argsString = "",
|
472
|
+
optionalCount = 0;
|
473
|
+
args.forEach((function(arg, optionIndex) {
|
474
|
+
// arg:required optionIndex:required
|
475
|
+
return (function() {
|
476
|
+
if (((arg)[0] === "optional")) {
|
477
|
+
argsString = (argsString + "if (arguments.length < " + (args.length - optionalCount) + ")" + " // if " + translate((arg)[1]) + " is missing" + indent(("var " + map(args.slice((optionIndex + 1)), (function(arg, argIndex) {
|
478
|
+
// arg:required argIndex:required
|
479
|
+
return (translate((arg)[1]) + " = " + translate(((args)[(optionIndex + argIndex)])[1]));
|
480
|
+
})) // chain
|
481
|
+
.reverse()
|
482
|
+
.concat((translate((arg)[1]) + " = undefined"))
|
483
|
+
.join(", ")
|
484
|
+
+ ";")));
|
485
|
+
return ((optionalCount)++);
|
486
|
+
}
|
487
|
+
})();
|
488
|
+
}));
|
489
|
+
return (function() {
|
490
|
+
if (typeof(rest) !== 'undefined') {
|
491
|
+
return (argsString + "var " + translate((rest)[1]) + " = Array.prototype.slice.call(arguments, " + args.length + ");\n");
|
492
|
+
} else {
|
493
|
+
return argsString;
|
494
|
+
}
|
495
|
+
})();
|
496
|
+
});
|
497
|
+
|
498
|
+
var buildCommentString = (function(args) {
|
499
|
+
// args:required
|
500
|
+
return (function() {
|
501
|
+
if (((args).length === 0)) {
|
502
|
+
return "";
|
503
|
+
} else {
|
504
|
+
return ("// " + (map(args, (function(arg) {
|
505
|
+
// arg:required
|
506
|
+
return (translate((arg)[1]) + ":" + (arg)[0]);
|
507
|
+
}))).join(" "));
|
508
|
+
}
|
509
|
+
})();
|
510
|
+
});
|
511
|
+
|
512
|
+
// brain 'splode
|
513
|
+
macros.lambda = (function(arglist, body) {
|
514
|
+
// arglist:required body:rest
|
515
|
+
var body = Array.prototype.slice.call(arguments, 1);
|
516
|
+
|
517
|
+
var args = transformArgs(arglist),
|
518
|
+
rest = (select(args, (function(arg) {
|
519
|
+
// arg:required
|
520
|
+
return ("rest" === (arg)[0]);
|
521
|
+
})))[0],
|
522
|
+
docString = undefined;
|
523
|
+
(body)[(body.length - 1)] = [ "return", (body)[(body.length - 1)] ];
|
524
|
+
(function() {
|
525
|
+
if (((typeof((body)[0]) === "string") && (body)[0].match(/^".*"$/))) {
|
526
|
+
return docString = ("/* " + eval(body.shift()) + " */\n");
|
527
|
+
}
|
528
|
+
})();
|
529
|
+
var noRestArgs = (function() {
|
530
|
+
if (rest) {
|
531
|
+
return args.slice(0, -1);
|
532
|
+
} else {
|
533
|
+
return args;
|
534
|
+
}
|
535
|
+
})(),
|
536
|
+
argsString = buildArgsString(noRestArgs, rest),
|
537
|
+
commentString = buildCommentString(args);
|
538
|
+
return ("(function(" + (map(args, (function(arg) {
|
539
|
+
// arg:required
|
540
|
+
return translate((arg)[1]);
|
541
|
+
}))).join(", ") + ") {" + indent(commentString, docString, argsString, (map(body, (function(stmt) {
|
542
|
+
// stmt:required
|
543
|
+
var tstmt = translate(stmt);
|
544
|
+
return (tstmt + (function() {
|
545
|
+
if (((tstmt.slice(-1))[0] === ";")) {
|
546
|
+
return "";
|
547
|
+
} else {
|
548
|
+
return ";";
|
549
|
+
}
|
550
|
+
})());
|
551
|
+
}))).join("\n")) + "})");
|
552
|
+
});
|
553
|
+
|
554
|
+
macros.quote = (function(item) {
|
555
|
+
// item:required
|
556
|
+
return (function() {
|
557
|
+
if (("Array" === item.constructor.name)) {
|
558
|
+
return ("[ " + (map(item, macros.quote)).join(", ") + " ]");
|
559
|
+
} else {
|
560
|
+
return (function() {
|
561
|
+
if (("number" === typeof(item))) {
|
562
|
+
return item;
|
563
|
+
} else {
|
564
|
+
return ("\"" + literal(item) + "\"");
|
565
|
+
}
|
566
|
+
})();
|
567
|
+
}
|
568
|
+
})();
|
569
|
+
});
|
570
|
+
|
571
|
+
macros.hash = (function(pairs) {
|
572
|
+
// pairs:rest
|
573
|
+
var pairs = Array.prototype.slice.call(arguments, 0);
|
574
|
+
|
575
|
+
(function() {
|
576
|
+
if ((0 !== (pairs.length % 2))) {
|
577
|
+
return error(("odd number of key-value pairs in hash: " + inspect(pairs)));
|
578
|
+
}
|
579
|
+
})();
|
580
|
+
var pairStrings = bulkMap(pairs, (function(key, value) {
|
581
|
+
// key:required value:required
|
582
|
+
return (translate(key) + ": " + translate(value));
|
583
|
+
}));
|
584
|
+
return (function() {
|
585
|
+
if ((1 >= pairStrings.length)) {
|
586
|
+
return ("{ " + (pairStrings).join(", ") + " }");
|
587
|
+
} else {
|
588
|
+
return ("{" + indent((pairStrings).join(",\n")) + "}");
|
589
|
+
}
|
590
|
+
})();
|
591
|
+
});
|
592
|
+
|
593
|
+
var literal = (function(string) {
|
594
|
+
// string:required
|
595
|
+
return inject(string // chain
|
596
|
+
.replace(/\*/g, "_")
|
597
|
+
.replace(/\?$/, "__QUERY")
|
598
|
+
.replace(/!$/, "__BANG")
|
599
|
+
, string.match(/-(.)/g), (function(returnString, match) {
|
600
|
+
// returnString:required match:required
|
601
|
+
return returnString.replace(match, (match)[1].toUpperCase());
|
602
|
+
}));
|
603
|
+
});
|
604
|
+
|
605
|
+
var translate = (function(token, hint) {
|
606
|
+
// token:required hint:required
|
607
|
+
var hint = hint;
|
608
|
+
(function() {
|
609
|
+
if ((hint && typeof((macros)[hint]) === 'undefined')) {
|
610
|
+
return hint = undefined;
|
611
|
+
}
|
612
|
+
})();
|
613
|
+
return (function() {
|
614
|
+
if (typeof(token) !== 'undefined') {
|
615
|
+
(function() {
|
616
|
+
if (typeof(token) === "string") {
|
617
|
+
return token = token.trim();
|
618
|
+
}
|
619
|
+
})();
|
620
|
+
return (function() {
|
621
|
+
try {
|
622
|
+
return (function() {
|
623
|
+
if ((token) && (token).constructor.name === "Array") {
|
624
|
+
return (function() {
|
625
|
+
if (typeof((macros)[translate((token)[0])]) !== 'undefined') {
|
626
|
+
return (macros)[translate((token)[0])].apply(undefined, token.slice(1));
|
627
|
+
} else {
|
628
|
+
return (macros)[(hint || "call")].apply(undefined, token);
|
629
|
+
}
|
630
|
+
})();
|
631
|
+
} else {
|
632
|
+
return (function() {
|
633
|
+
if ((typeof(token) === "string" && token.match((new RegExp(("^" + sibilant.tokens.literal + "$"), undefined))))) {
|
634
|
+
return literal(token);
|
635
|
+
} else {
|
636
|
+
return (function() {
|
637
|
+
if ((typeof(token) === "string" && token.match((new RegExp("^;", undefined))))) {
|
638
|
+
return token.replace((new RegExp("^;+", undefined)), "//");
|
639
|
+
} else {
|
640
|
+
return (function() {
|
641
|
+
if ((typeof(token) === "string" && ("\"" === (token)[0] &&
|
642
|
+
"\"" === (token.slice(-1))[0]))) {
|
643
|
+
return token // chain
|
644
|
+
.split("\n")
|
645
|
+
.join("\\n\" +\n\"");
|
646
|
+
} else {
|
647
|
+
return token;
|
648
|
+
}
|
649
|
+
})();
|
650
|
+
}
|
651
|
+
})();
|
652
|
+
}
|
653
|
+
})();
|
654
|
+
}
|
655
|
+
})();
|
656
|
+
} catch (e) {
|
657
|
+
return error((e.stack + "\n" + "Encountered when attempting to process:\n" + indent(inspect(token))));
|
658
|
+
}
|
659
|
+
})();
|
660
|
+
}
|
661
|
+
})();
|
662
|
+
});
|
663
|
+
|
664
|
+
(sibilant)["translate"] = translate;
|
665
|
+
var translateAll = (function(contents) {
|
666
|
+
// contents:required
|
667
|
+
var buffer = "";
|
668
|
+
tokenize(contents).forEach((function(token) {
|
669
|
+
// token:required
|
670
|
+
var line = translate(token, "statement");
|
671
|
+
return (function() {
|
672
|
+
if (line) {
|
673
|
+
return buffer = (buffer + line + "\n");
|
674
|
+
}
|
675
|
+
})();
|
676
|
+
}));
|
677
|
+
return buffer;
|
678
|
+
});
|
679
|
+
|
680
|
+
(sibilant)["translateAll"] = translateAll;
|
681
|
+
|
682
|
+
macros.include = (function(file) {
|
683
|
+
// file:required
|
684
|
+
return sibilant.include(eval(translate(file)));
|
685
|
+
});
|
686
|
+
|
687
|
+
sibilant.include(path.normalize((__dirname + "/../include/macros")));
|
688
|
+
|