cleaning up implementation of apply() entry point
removing use of interpreter in computed calls to builtins
This commit is contained in:
parent
94814a2e34
commit
86b7738c89
|
@ -9,7 +9,7 @@
|
||||||
(define Instructions
|
(define Instructions
|
||||||
(make-enum-table
|
(make-enum-table
|
||||||
[:nop :dup :pop :call :tcall :jmp :brf :brt :jmp.l :brf.l :brt.l :ret
|
[:nop :dup :pop :call :tcall :jmp :brf :brt :jmp.l :brf.l :brt.l :ret
|
||||||
:tapply :for
|
:tapply
|
||||||
|
|
||||||
:eq? :eqv? :equal? :atom? :not :null? :boolean? :symbol?
|
:eq? :eqv? :equal? :atom? :not :null? :boolean? :symbol?
|
||||||
:number? :bound? :pair? :builtin? :vector? :fixnum?
|
:number? :bound? :pair? :builtin? :vector? :fixnum?
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
:loadg :loada :loadc :loadg.l
|
:loadg :loada :loadc :loadg.l
|
||||||
:setg :seta :setc :setg.l
|
:setg :seta :setc :setg.l
|
||||||
|
|
||||||
:closure :trycatch :argc :vargc :close :let]))
|
:closure :trycatch :argc :vargc :close :let :for]))
|
||||||
|
|
||||||
(define arg-counts
|
(define arg-counts
|
||||||
(table :eq? 2 :eqv? 2
|
(table :eq? 2 :eqv? 2
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
static char *builtin_names[] =
|
static char *builtin_names[] =
|
||||||
{ // special forms
|
{ // special forms
|
||||||
"quote", "cond", "if", "and", "or", "while", "lambda",
|
"quote", "cond", "if", "and", "or", "while", "lambda",
|
||||||
"trycatch", "%apply", "%applyn", "set!", "prog1", "for", "begin",
|
"trycatch", "%apply", "set!", "prog1", "for", "begin",
|
||||||
|
|
||||||
// predicates
|
// predicates
|
||||||
"eq?", "eqv?", "equal?", "atom?", "not", "null?", "boolean?", "symbol?",
|
"eq?", "eqv?", "equal?", "atom?", "not", "null?", "boolean?", "symbol?",
|
||||||
|
@ -74,6 +74,16 @@ static char *builtin_names[] =
|
||||||
"vector", "aref", "aset!",
|
"vector", "aref", "aset!",
|
||||||
"", "", "" };
|
"", "", "" };
|
||||||
|
|
||||||
|
#define ANYARGS -10000
|
||||||
|
|
||||||
|
static short builtin_arg_counts[] =
|
||||||
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
2, ANYARGS, 1, 1, 2, 2,
|
||||||
|
1, 2,
|
||||||
|
ANYARGS, -1, ANYARGS, -1, 2, 2, 2,
|
||||||
|
ANYARGS, 2, 3 };
|
||||||
|
|
||||||
#define N_STACK 262144
|
#define N_STACK 262144
|
||||||
value_t StaticStack[N_STACK];
|
value_t StaticStack[N_STACK];
|
||||||
value_t *Stack = StaticStack;
|
value_t *Stack = StaticStack;
|
||||||
|
@ -467,7 +477,7 @@ static void trace_globals(symbol_t *root)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static value_t special_apply_form, special_applyn_form;
|
static value_t special_apply_form;
|
||||||
static value_t apply1_args;
|
static value_t apply1_args;
|
||||||
static value_t memory_exception_value;
|
static value_t memory_exception_value;
|
||||||
|
|
||||||
|
@ -502,7 +512,6 @@ void gc(int mustgrow)
|
||||||
}
|
}
|
||||||
lasterror = relocate(lasterror);
|
lasterror = relocate(lasterror);
|
||||||
special_apply_form = relocate(special_apply_form);
|
special_apply_form = relocate(special_apply_form);
|
||||||
special_applyn_form = relocate(special_applyn_form);
|
|
||||||
apply1_args = relocate(apply1_args);
|
apply1_args = relocate(apply1_args);
|
||||||
memory_exception_value = relocate(memory_exception_value);
|
memory_exception_value = relocate(memory_exception_value);
|
||||||
|
|
||||||
|
@ -541,22 +550,32 @@ void gc(int mustgrow)
|
||||||
|
|
||||||
// utils ----------------------------------------------------------------------
|
// utils ----------------------------------------------------------------------
|
||||||
|
|
||||||
value_t apply(value_t f, value_t l)
|
#define topeval(e, env) (selfevaluating(e) ? (e) : eval_sexpr((e),env,1,2))
|
||||||
|
|
||||||
|
// apply function with n args on the stack
|
||||||
|
static value_t _applyn(uint32_t n)
|
||||||
{
|
{
|
||||||
PUSH(f);
|
PUSH(fixnum(n));
|
||||||
PUSH(l);
|
return topeval(special_apply_form, NULL);
|
||||||
value_t v = toplevel_eval(special_apply_form);
|
|
||||||
POPN(2);
|
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t apply1(value_t f, value_t a0)
|
value_t apply(value_t f, value_t l)
|
||||||
{
|
{
|
||||||
|
value_t v = l;
|
||||||
|
uint32_t n = SP;
|
||||||
|
|
||||||
PUSH(f);
|
PUSH(f);
|
||||||
PUSH(a0);
|
while (iscons(v)) {
|
||||||
PUSH(fixnum(1));
|
if (n == MAX_ARGS) {
|
||||||
value_t v = toplevel_eval(special_applyn_form);
|
PUSH(v);
|
||||||
POPN(3);
|
break;
|
||||||
|
}
|
||||||
|
PUSH(car_(v));
|
||||||
|
v = cdr_(v);
|
||||||
|
}
|
||||||
|
n = SP - n - 1;
|
||||||
|
v = _applyn(n);
|
||||||
|
POPN(n+1);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,9 +590,8 @@ value_t applyn(uint32_t n, value_t f, ...)
|
||||||
value_t a = va_arg(ap, value_t);
|
value_t a = va_arg(ap, value_t);
|
||||||
PUSH(a);
|
PUSH(a);
|
||||||
}
|
}
|
||||||
PUSH(fixnum(n));
|
value_t v = _applyn(n);
|
||||||
value_t v = toplevel_eval(special_applyn_form);
|
POPN(n+1);
|
||||||
POPN(n+2);
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,7 +700,6 @@ static value_t list(value_t *args, uint32_t nargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define eval(e) (selfevaluating(e) ? (e) : eval_sexpr((e),penv,0,envsz))
|
#define eval(e) (selfevaluating(e) ? (e) : eval_sexpr((e),penv,0,envsz))
|
||||||
#define topeval(e, env) (selfevaluating(e) ? (e) : eval_sexpr((e),env,1,2))
|
|
||||||
#define tail_eval(xpr) do { \
|
#define tail_eval(xpr) do { \
|
||||||
if (selfevaluating(xpr)) { SP=saveSP; return (xpr); } \
|
if (selfevaluating(xpr)) { SP=saveSP; return (xpr); } \
|
||||||
else { e=(xpr); goto eval_top; } } while (0)
|
else { e=(xpr); goto eval_top; } } while (0)
|
||||||
|
@ -763,7 +780,7 @@ static value_t do_trycatch(value_t expr, value_t *penv, uint32_t envsz)
|
||||||
else {
|
else {
|
||||||
v = car_(v);
|
v = car_(v);
|
||||||
Stack[SP-1] = eval(v);
|
Stack[SP-1] = eval(v);
|
||||||
v = apply1(Stack[SP-1], lasterror);
|
v = applyn(1, Stack[SP-1], lasterror);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return v;
|
return v;
|
||||||
|
@ -1387,21 +1404,15 @@ static value_t eval_sexpr(value_t e, value_t *penv, int tail, uint32_t envsz)
|
||||||
penv = &Stack[SP-2];
|
penv = &Stack[SP-2];
|
||||||
}
|
}
|
||||||
goto eval_top;
|
goto eval_top;
|
||||||
case F_SPECIAL_APPLYN:
|
case F_SPECIAL_APPLY:
|
||||||
POPN(4);
|
POPN(2);
|
||||||
v = POP();
|
v = POP();
|
||||||
|
saveSP = SP;
|
||||||
nargs = numval(v);
|
nargs = numval(v);
|
||||||
bp = SP-nargs-2;
|
bp = SP-nargs-2;
|
||||||
f = Stack[bp+1];
|
f = Stack[bp+1];
|
||||||
penv = &Stack[bp+1];
|
penv = &Stack[bp+1];
|
||||||
goto do_apply;
|
goto do_apply;
|
||||||
case F_SPECIAL_APPLY:
|
|
||||||
f = Stack[bp-4];
|
|
||||||
v = Stack[bp-3];
|
|
||||||
PUSH(f);
|
|
||||||
PUSH(v);
|
|
||||||
nargs = 2;
|
|
||||||
// falls through!!
|
|
||||||
case F_APPLY:
|
case F_APPLY:
|
||||||
argcount("apply", nargs, 2);
|
argcount("apply", nargs, 2);
|
||||||
v = Stack[SP-1]; // second arg is new arglist
|
v = Stack[SP-1]; // second arg is new arglist
|
||||||
|
@ -1429,7 +1440,7 @@ static value_t eval_sexpr(value_t e, value_t *penv, int tail, uint32_t envsz)
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
f = Stack[bp+1];
|
f = Stack[bp+1];
|
||||||
assert(SP > bp+1);
|
assert((signed)SP > (signed)bp+1);
|
||||||
if (__likely(iscons(f))) {
|
if (__likely(iscons(f))) {
|
||||||
if (car_(f) == COMPILEDLAMBDA) {
|
if (car_(f) == COMPILEDLAMBDA) {
|
||||||
i = SP;
|
i = SP;
|
||||||
|
@ -1535,10 +1546,10 @@ static value_t eval_sexpr(value_t e, value_t *penv, int tail, uint32_t envsz)
|
||||||
*/
|
*/
|
||||||
static value_t apply_cl(uint32_t nargs)
|
static value_t apply_cl(uint32_t nargs)
|
||||||
{
|
{
|
||||||
uint32_t i, n, ip, bp, envsz, captured;
|
uint32_t i, n, ip, bp, envsz, captured, op;
|
||||||
fixnum_t s, lo, hi;
|
fixnum_t s, lo, hi;
|
||||||
int64_t accum;
|
int64_t accum;
|
||||||
uint8_t op, *code;
|
uint8_t *code;
|
||||||
value_t func, v, bcode, x, e;
|
value_t func, v, bcode, x, e;
|
||||||
value_t *pvals, *lenv, *pv;
|
value_t *pvals, *lenv, *pv;
|
||||||
symbol_t *sym;
|
symbol_t *sym;
|
||||||
|
@ -1615,12 +1626,31 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
s = SP;
|
s = SP;
|
||||||
func = Stack[SP-i-1];
|
func = Stack[SP-i-1];
|
||||||
if (isbuiltinish(func)) {
|
if (isbuiltinish(func)) {
|
||||||
if (uintval(func) > N_BUILTINS) {
|
op = uintval(func);
|
||||||
|
if (op > N_BUILTINS) {
|
||||||
v = ((builtin_t)ptr(func))(&Stack[SP-i], i);
|
v = ((builtin_t)ptr(func))(&Stack[SP-i], i);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PUSH(fixnum(i));
|
s = builtin_arg_counts[op];
|
||||||
v = toplevel_eval(special_applyn_form);
|
if (s >= 0)
|
||||||
|
argcount(builtin_names[op], i, s);
|
||||||
|
else if (s != ANYARGS && (signed)i < -s)
|
||||||
|
argcount(builtin_names[op], i, -s);
|
||||||
|
// remove function arg
|
||||||
|
for(s=SP-i-1; s < (int)SP-1; s++)
|
||||||
|
Stack[s] = Stack[s+1];
|
||||||
|
SP--;
|
||||||
|
n = i;
|
||||||
|
switch (op) {
|
||||||
|
case OP_LIST: goto apply_list;
|
||||||
|
case OP_ADD: goto apply_add;
|
||||||
|
case OP_SUB: goto apply_sub;
|
||||||
|
case OP_MUL: goto apply_mul;
|
||||||
|
case OP_DIV: goto apply_div;
|
||||||
|
case OP_VECTOR: goto apply_vector;
|
||||||
|
default:
|
||||||
|
goto dispatch;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (iscons(func)) {
|
else if (iscons(func)) {
|
||||||
|
@ -1637,8 +1667,7 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PUSH(fixnum(i));
|
v = _applyn(i);
|
||||||
v = toplevel_eval(special_applyn_form);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1755,6 +1784,7 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
POPN(1); break;
|
POPN(1); break;
|
||||||
case OP_LIST:
|
case OP_LIST:
|
||||||
i = code[ip++];
|
i = code[ip++];
|
||||||
|
apply_list:
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
v = list(&Stack[SP-i], i);
|
v = list(&Stack[SP-i], i);
|
||||||
else
|
else
|
||||||
|
@ -1784,8 +1814,9 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
goto do_call;
|
goto do_call;
|
||||||
|
|
||||||
case OP_ADD:
|
case OP_ADD:
|
||||||
s = 0;
|
|
||||||
n = code[ip++];
|
n = code[ip++];
|
||||||
|
apply_add:
|
||||||
|
s = 0;
|
||||||
i = SP-n;
|
i = SP-n;
|
||||||
if (n > MAX_ARGS) goto add_ovf;
|
if (n > MAX_ARGS) goto add_ovf;
|
||||||
for (; i < SP; i++) {
|
for (; i < SP; i++) {
|
||||||
|
@ -1809,6 +1840,7 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
break;
|
break;
|
||||||
case OP_SUB:
|
case OP_SUB:
|
||||||
n = code[ip++];
|
n = code[ip++];
|
||||||
|
apply_sub:
|
||||||
if (__unlikely(n < 1)) lerror(ArgError, "-: too few arguments");
|
if (__unlikely(n < 1)) lerror(ArgError, "-: too few arguments");
|
||||||
i = SP-n;
|
i = SP-n;
|
||||||
if (n == 1) {
|
if (n == 1) {
|
||||||
|
@ -1845,8 +1877,9 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
PUSH(v);
|
PUSH(v);
|
||||||
break;
|
break;
|
||||||
case OP_MUL:
|
case OP_MUL:
|
||||||
accum = 1;
|
|
||||||
n = code[ip++];
|
n = code[ip++];
|
||||||
|
apply_mul:
|
||||||
|
accum = 1;
|
||||||
i = SP-n;
|
i = SP-n;
|
||||||
if (n > MAX_ARGS) goto mul_ovf;
|
if (n > MAX_ARGS) goto mul_ovf;
|
||||||
for (; i < SP; i++) {
|
for (; i < SP; i++) {
|
||||||
|
@ -1870,6 +1903,7 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
break;
|
break;
|
||||||
case OP_DIV:
|
case OP_DIV:
|
||||||
n = code[ip++];
|
n = code[ip++];
|
||||||
|
apply_div:
|
||||||
if (__unlikely(n < 1)) lerror(ArgError, "/: too few arguments");
|
if (__unlikely(n < 1)) lerror(ArgError, "/: too few arguments");
|
||||||
i = SP-n;
|
i = SP-n;
|
||||||
if (n == 1) {
|
if (n == 1) {
|
||||||
|
@ -1916,19 +1950,20 @@ static value_t apply_cl(uint32_t nargs)
|
||||||
|
|
||||||
case OP_VECTOR:
|
case OP_VECTOR:
|
||||||
n = code[ip++];
|
n = code[ip++];
|
||||||
|
apply_vector:
|
||||||
if (n > MAX_ARGS) {
|
if (n > MAX_ARGS) {
|
||||||
i = llength(Stack[SP-1]);
|
i = llength(Stack[SP-1])-1;
|
||||||
n--;
|
|
||||||
}
|
}
|
||||||
else i = 0;
|
else i = 0;
|
||||||
v = alloc_vector(n+i, 0);
|
v = alloc_vector(n+i, 0);
|
||||||
memcpy(&vector_elt(v,0), &Stack[SP-n], n*sizeof(value_t));
|
memcpy(&vector_elt(v,0), &Stack[SP-n], n*sizeof(value_t));
|
||||||
if (i > 0) {
|
e = POP();
|
||||||
e = POP();
|
POPN(n-1);
|
||||||
POPN(n);
|
if (n > MAX_ARGS) {
|
||||||
|
i = n-1;
|
||||||
while (iscons(e)) {
|
while (iscons(e)) {
|
||||||
vector_elt(v,n) = car_(e);
|
vector_elt(v,i) = car_(e);
|
||||||
n++;
|
i++;
|
||||||
e = cdr_(e);
|
e = cdr_(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2200,11 +2235,10 @@ static void lisp_init(void)
|
||||||
set(printwidthsym=symbol("*print-width*"), fixnum(SCR_WIDTH));
|
set(printwidthsym=symbol("*print-width*"), fixnum(SCR_WIDTH));
|
||||||
lasterror = NIL;
|
lasterror = NIL;
|
||||||
special_apply_form = fl_cons(builtin(F_SPECIAL_APPLY), NIL);
|
special_apply_form = fl_cons(builtin(F_SPECIAL_APPLY), NIL);
|
||||||
special_applyn_form = fl_cons(builtin(F_SPECIAL_APPLYN), NIL);
|
|
||||||
apply1_args = fl_cons(NIL, NIL);
|
apply1_args = fl_cons(NIL, NIL);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (isspecial(builtin(i))) {
|
while (isspecial(builtin(i))) {
|
||||||
if (i != F_SPECIAL_APPLY && i != F_SPECIAL_APPLYN)
|
if (i != F_SPECIAL_APPLY)
|
||||||
((symbol_t*)ptr(symbol(builtin_names[i])))->syntax = builtin(i);
|
((symbol_t*)ptr(symbol(builtin_names[i])))->syntax = builtin(i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -2304,7 +2338,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
PUSH(symbol_value(symbol("__start")));
|
PUSH(symbol_value(symbol("__start")));
|
||||||
PUSH(argv_list(argc, argv));
|
PUSH(argv_list(argc, argv));
|
||||||
(void)toplevel_eval(special_apply_form);
|
(void)_applyn(1);
|
||||||
}
|
}
|
||||||
FL_CATCH {
|
FL_CATCH {
|
||||||
ios_puts("fatal error during bootstrap:\n", ios_stderr);
|
ios_puts("fatal error during bootstrap:\n", ios_stderr);
|
||||||
|
|
|
@ -117,8 +117,7 @@ extern uint32_t SP;
|
||||||
enum {
|
enum {
|
||||||
// special forms
|
// special forms
|
||||||
F_QUOTE=0, F_COND, F_IF, F_AND, F_OR, F_WHILE, F_LAMBDA,
|
F_QUOTE=0, F_COND, F_IF, F_AND, F_OR, F_WHILE, F_LAMBDA,
|
||||||
F_TRYCATCH, F_SPECIAL_APPLY, F_SPECIAL_APPLYN, F_SETQ, F_PROG1, F_FOR,
|
F_TRYCATCH, F_SPECIAL_APPLY, F_SETQ, F_PROG1, F_FOR, F_BEGIN,
|
||||||
F_BEGIN,
|
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
F_EQ, F_EQV, F_EQUAL, F_ATOM, F_NOT, F_NULL, F_BOOLEANP, F_SYMBOLP,
|
F_EQ, F_EQV, F_EQUAL, F_ATOM, F_NOT, F_NULL, F_BOOLEANP, F_SYMBOLP,
|
||||||
|
@ -141,7 +140,6 @@ value_t read_sexpr(value_t f);
|
||||||
void print(ios_t *f, value_t v, int princ);
|
void print(ios_t *f, value_t v, int princ);
|
||||||
value_t toplevel_eval(value_t expr);
|
value_t toplevel_eval(value_t expr);
|
||||||
value_t apply(value_t f, value_t l);
|
value_t apply(value_t f, value_t l);
|
||||||
value_t apply1(value_t f, value_t a0);
|
|
||||||
value_t applyn(uint32_t n, value_t f, ...);
|
value_t applyn(uint32_t n, value_t f, ...);
|
||||||
value_t load_file(char *fname);
|
value_t load_file(char *fname);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
OP_NOP=0, OP_DUP, OP_POP, OP_CALL, OP_TCALL, OP_JMP, OP_BRF, OP_BRT,
|
OP_NOP=0, OP_DUP, OP_POP, OP_CALL, OP_TCALL, OP_JMP, OP_BRF, OP_BRT,
|
||||||
OP_JMPL, OP_BRFL, OP_BRTL, OP_RET, OP_TAPPLY, OP_FOR,
|
OP_JMPL, OP_BRFL, OP_BRTL, OP_RET, OP_TAPPLY,
|
||||||
|
|
||||||
OP_EQ, OP_EQV, OP_EQUAL, OP_ATOMP, OP_NOT, OP_NULLP, OP_BOOLEANP,
|
OP_EQ, OP_EQV, OP_EQUAL, OP_ATOMP, OP_NOT, OP_NULLP, OP_BOOLEANP,
|
||||||
OP_SYMBOLP, OP_NUMBERP, OP_BOUNDP, OP_PAIRP, OP_BUILTINP, OP_VECTORP,
|
OP_SYMBOLP, OP_NUMBERP, OP_BOUNDP, OP_PAIRP, OP_BUILTINP, OP_VECTORP,
|
||||||
|
@ -20,7 +20,7 @@ enum {
|
||||||
OP_LOADV, OP_LOADVL, OP_LOADG, OP_LOADA, OP_LOADC, OP_LOADGL,
|
OP_LOADV, OP_LOADVL, OP_LOADG, OP_LOADA, OP_LOADC, OP_LOADGL,
|
||||||
OP_SETG, OP_SETA, OP_SETC, OP_SETGL,
|
OP_SETG, OP_SETA, OP_SETC, OP_SETGL,
|
||||||
|
|
||||||
OP_CLOSURE, OP_TRYCATCH, OP_ARGC, OP_VARGC, OP_CLOSE, OP_LET
|
OP_CLOSURE, OP_TRYCATCH, OP_ARGC, OP_VARGC, OP_CLOSE, OP_LET, OP_FOR
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -735,7 +735,7 @@
|
||||||
(lambda (e) (begin (print-exception e)
|
(lambda (e) (begin (print-exception e)
|
||||||
(exit 1)))))
|
(exit 1)))))
|
||||||
|
|
||||||
(define (__start . argv)
|
(define (__start argv)
|
||||||
; reload this file with our new definition of load
|
; reload this file with our new definition of load
|
||||||
(load (string *install-dir* *directory-separator* "system.lsp"))
|
(load (string *install-dir* *directory-separator* "system.lsp"))
|
||||||
(if (pair? (cdr argv))
|
(if (pair? (cdr argv))
|
||||||
|
|
Loading…
Reference in New Issue