1 // This file is prepended to the result of compile jscl.lisp, and
2 // contain runtime code that jscl assumes to exist.
7 globalEval = eval; // Just an indirect eval
9 function pv (x) { return x==undefined? nil: x; }
12 var r = [].slice.call(arguments);
13 r['multiple-value'] = true;
17 function forcemv (x) {
18 return typeof x == 'object' && 'multiple-value' in x? x: mv(x);
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.
27 function checkArgsAtLeast(args, n){
28 if (args < n) throw 'too few arguments';
31 function checkArgsAtMost(args, n){
32 if (args > n) throw 'too many arguments';
35 function checkArgs(args, n){
36 checkArgsAtLeast(args, n);
37 checkArgsAtMost(args, n);
40 // Improper list constructor (like LIST*)
42 if (arguments.length == 1)
45 var i = arguments.length-1;
46 var r = arguments[i--];
48 r = {car: arguments[i], cdr: r};
55 // Create and return a lisp string for the Javascript string STRING.
56 function make_lisp_string (string){
57 var array = string.split("");
58 array.type = 'character'
62 function xstring(x){ return x.join(''); }
65 function Symbol(name, package_name){
68 this['package'] = package_name;
71 function lisp_to_js (x) {
72 if (typeof x == 'object' && 'length' in x && x.type == 'character')
74 else if (typeof x == 'function'){
75 // Trampoline calling the Lisp function
77 var args = Array.prototype.slice.call(arguments);
79 args[i] = js_to_lisp(args[i]);
80 return lisp_to_js(x.apply(this, [pv, arguments.length].concat(args)));
86 function js_to_lisp (x) {
87 if (typeof x == 'string')
88 return make_lisp_string(x);
89 else if (typeof x == 'function'){
90 // Trampoline calling the JS function
91 return (function(values, nargs){
92 var args = Array.prototype.slice.call(arguments, 2);
94 args[i] = lisp_to_js(args[i]);
95 return values(js_to_lisp(x.apply(this, args)));