Rename project to JSCL
[jscl.git] / src / prelude.js
1 // This file is prepended to the result of compile jscl.lisp, and
2 // contain runtime code that jscl assumes to exist.
3
4 var window = this;
5 var nil;
6
7 function globalEval (x) {
8     return eval.call (window, x);
9 }
10
11 function pv (x) { return x==undefined? nil: x; }
12
13 function mv(){
14     var r = [].slice.call(arguments);
15     r['multiple-value'] = true;
16     return r;
17 }
18
19 function forcemv (x) {
20     return typeof x == 'object' && 'multiple-value' in x? x: mv(x);
21 }
22
23 // NOTE: Define VALUES to be MV for toplevel forms. It is because
24 // `eval' compiles the forms and execute the Javascript code at
25 // toplevel with `js-eval', so it is necessary to return multiple
26 // values from the eval function.
27 var values = mv;
28
29 function checkArgsAtLeast(args, n){
30     if (args.length < n) throw 'too few arguments';
31 }
32
33 function checkArgsAtMost(args, n){
34     if (args.length > n) throw 'too many arguments';
35 }
36
37 function checkArgs(args, n){
38     checkArgsAtLeast(args, n);
39     checkArgsAtMost(args, n);
40 }
41
42 // Improper list constructor (like LIST*)
43 function QIList(){
44     if (arguments.length == 1)
45         return arguments[0];
46     else {
47         var i = arguments.length-1;
48         var r = arguments[i--];
49         for (; i>=0; i--){
50             r = {car: arguments[i], cdr: r};
51         }
52         return r;
53     }
54 }