277a9d98f5ae84ad9655d1c384f1719b6c2fd091
[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 globalEval = eval;  // Just an indirect eval
8
9 function pv (x) { return x==undefined? nil: x; }
10
11 function mv(){
12     var r = [].slice.call(arguments);
13     r['multiple-value'] = true;
14     return r;
15 }
16
17 function forcemv (x) {
18     return typeof x == 'object' && 'multiple-value' in x? x: mv(x);
19 }
20
21 // NOTE: Define VALUES to be MV for toplevel forms. It is because
22 // `eval' compiles the forms and execute the Javascript code at
23 // toplevel with `js-eval', so it is necessary to return multiple
24 // values from the eval function.
25 var values = mv;
26
27 function checkArgsAtLeast(args, n){
28     if (args.length < n) throw 'too few arguments';
29 }
30
31 function checkArgsAtMost(args, n){
32     if (args.length > n) throw 'too many arguments';
33 }
34
35 function checkArgs(args, n){
36     checkArgsAtLeast(args, n);
37     checkArgsAtMost(args, n);
38 }
39
40 // Improper list constructor (like LIST*)
41 function QIList(){
42     if (arguments.length == 1)
43         return arguments[0];
44     else {
45         var i = arguments.length-1;
46         var r = arguments[i--];
47         for (; i>=0; i--){
48             r = {car: arguments[i], cdr: r};
49         }
50         return r;
51     }
52 }