[uim-commit] r1190 - in branches/r5rs/sigscheme: . test
kzk at freedesktop.org
kzk at freedesktop.org
Sat Aug 13 02:59:14 EST 2005
Author: kzk
Date: 2005-08-12 09:59:11 -0700 (Fri, 12 Aug 2005)
New Revision: 1190
Modified:
branches/r5rs/sigscheme/eval.c
branches/r5rs/sigscheme/test/test-apply.scm
Log:
* bug fixes found in test-r4rs.scm
* sigscheme/eval.c
- (ScmOp_eval, ScmOp_eval): handle NIL arg lambda correctly
- (ScmExp_let_star): no need to create new cons cell for nil env
- (ScmExp_begin): update environment in each eval
- (ScmExp_define): don't lookup env and adding var to the env absolutely
* sigscheme/test/test-apply.scm
- remove wrong testcase for substring
Modified: branches/r5rs/sigscheme/eval.c
===================================================================
--- branches/r5rs/sigscheme/eval.c 2005-08-12 15:02:10 UTC (rev 1189)
+++ branches/r5rs/sigscheme/eval.c 2005-08-12 16:59:11 UTC (rev 1190)
@@ -90,7 +90,7 @@
ScmObj frame = SCM_NIL;
/* create new frame */
- frame = Scm_NewCons(vars, vals);
+ frame = Scm_NewCons(vars, vals);
/* add to env */
if (SCM_NULLP(env))
@@ -111,23 +111,23 @@
/* sanity check */
if (SCM_NULLP(var))
- return env;
+ return env;
/* add (var val) pair to the newest frame in env */
if (SCM_NULLP(env)) {
- newest_frame = Scm_NewCons(Scm_NewCons(var, SCM_NIL),
- Scm_NewCons(val, SCM_NIL));
- env = Scm_NewCons(newest_frame,
- SCM_NIL);
+ newest_frame = Scm_NewCons(Scm_NewCons(var, SCM_NIL),
+ Scm_NewCons(val, SCM_NIL));
+ env = Scm_NewCons(newest_frame,
+ SCM_NIL);
} else if (SCM_CONSP(env)) {
- newest_frame = SCM_CAR(env);
- new_varlist = Scm_NewCons(var, SCM_CAR(newest_frame));
- new_vallist = Scm_NewCons(val, SCM_CDR(newest_frame));
+ newest_frame = SCM_CAR(env);
+ new_varlist = Scm_NewCons(var, SCM_CAR(newest_frame));
+ new_vallist = Scm_NewCons(val, SCM_CDR(newest_frame));
- tmp = Scm_NewCons(Scm_NewCons(new_varlist, new_vallist), SCM_CDR(env));
- *env = *tmp;
+ tmp = Scm_NewCons(Scm_NewCons(new_varlist, new_vallist), SCM_CDR(env));
+ *env = *tmp;
} else {
- SigScm_Error("broken environment\n");
+ SigScm_Error("broken environment\n");
}
return env;
}
@@ -178,16 +178,16 @@
vals = SCM_CDR(frame);
for (; !SCM_NULLP(vars); vars = SCM_CDR(vars), vals = SCM_CDR(vals)) {
- /* handle dot list */
- if (SCM_CONSP(vars)) {
- if (SCM_EQ(SCM_CAR(vars), var))
- return vals;
- } else {
- if (SCM_EQ(vars, var))
- return Scm_NewCons(vals, SCM_NIL);
- else
- return SCM_NIL;
- }
+ /* handle dot list */
+ if (SCM_CONSP(vars)) {
+ if (SCM_EQ(SCM_CAR(vars), var))
+ return vals;
+ } else {
+ if (SCM_EQ(vars, var))
+ return Scm_NewCons(vals, SCM_NIL);
+ else
+ return SCM_NIL;
+ }
}
return SCM_NIL;
@@ -207,107 +207,107 @@
case ScmSymbol:
return symbol_value(obj, env);
- /*====================================================================
- Evaluating Expression
- ====================================================================*/
+ /*====================================================================
+ Evaluating Expression
+ ====================================================================*/
case ScmCons:
{
- /*============================================================
- Evaluating CAR
- ============================================================*/
+ /*============================================================
+ Evaluating CAR
+ ============================================================*/
tmp = SCM_CAR(obj);
switch (SCM_GETTYPE(tmp)) {
- case ScmFunc:
- break;
- case ScmClosure:
- break;
+ case ScmFunc:
+ break;
+ case ScmClosure:
+ break;
case ScmSymbol:
tmp = symbol_value(tmp, env);
break;
case ScmCons:
tmp = ScmOp_eval(tmp, env);
break;
- case ScmEtc:
- /* QUOTE case */
- break;
- default:
- SigScm_ErrorObj("eval : invalid operation ", obj);
- break;
+ case ScmEtc:
+ /* QUOTE case */
+ break;
+ default:
+ SigScm_ErrorObj("eval : invalid operation ", obj);
+ break;
}
- /*============================================================
- Evaluating the rest of the List by the type of CAR
- ============================================================*/
+ /*============================================================
+ Evaluating the rest of the List by the type of CAR
+ ============================================================*/
switch (SCM_GETTYPE(tmp)) {
case ScmFunc:
- /*
- * Description of FUNCTYPE handling.
- *
- * - FUNCTYPE_L
- * - evaluate all the args and pass it to func
- *
- * - FUNCTYPE_R
- * - not evaluate all the arguments
- *
- * - FUNCTYPE_2N
- * - call the function with each 2 objs
- *
- * - FUNCTYPE_0
- * - FUNCTYPE_1
- * - FUNCTYPE_2
- * - FUNCTYPE_3
- * - FUNCTYPE_4
- * - FUNCTYPE_5
- * - call the function with 0-5 arguments
- */
+ /*
+ * Description of FUNCTYPE handling.
+ *
+ * - FUNCTYPE_L
+ * - evaluate all the args and pass it to func
+ *
+ * - FUNCTYPE_R
+ * - not evaluate all the arguments
+ *
+ * - FUNCTYPE_2N
+ * - call the function with each 2 objs
+ *
+ * - FUNCTYPE_0
+ * - FUNCTYPE_1
+ * - FUNCTYPE_2
+ * - FUNCTYPE_3
+ * - FUNCTYPE_4
+ * - FUNCTYPE_5
+ * - call the function with 0-5 arguments
+ */
switch (SCM_FUNC_NUMARG(tmp)) {
case FUNCTYPE_L:
{
return SCM_FUNC_EXEC_SUBRL(tmp,
map_eval(SCM_CDR(obj), env),
- env);
+ env);
}
- case FUNCTYPE_R:
- {
- obj = SCM_FUNC_EXEC_SUBRR(tmp,
- SCM_CDR(obj),
- &env,
- &tail_flag);
+ case FUNCTYPE_R:
+ {
+ obj = SCM_FUNC_EXEC_SUBRR(tmp,
+ SCM_CDR(obj),
+ &env,
+ &tail_flag);
- /*
- * The core point of tail-recursion
- *
- * if tail_flag == 1, SCM_FUNC_EXEC_SUBRR returns raw S-expression.
- * So we need to evaluate it! This is for not to consume stack,
- * that is, tail-recursion optimization.
- */
- if (tail_flag == 1)
- goto eval_loop;
- else
- return obj;
- }
- case FUNCTYPE_2N:
- {
- obj = SCM_CDR(obj);
+ /*
+ * The core point of tail-recursion
+ *
+ * if tail_flag == 1, SCM_FUNC_EXEC_SUBRR returns raw S-expression.
+ * So we need to evaluate it! This is for not to consume stack,
+ * that is, tail-recursion optimization.
+ */
+ if (tail_flag == 1)
+ goto eval_loop;
+ else
+ return obj;
+ }
+ case FUNCTYPE_2N:
+ {
+ obj = SCM_CDR(obj);
- /* check 1st arg */
- if (SCM_NULLP(obj))
- return SCM_FUNC_EXEC_SUBR2N(tmp, SCM_NIL, SCM_NIL);
+ /* check 1st arg */
+ if (SCM_NULLP(obj))
+ return SCM_FUNC_EXEC_SUBR2N(tmp, SCM_NIL, SCM_NIL);
- /* eval 1st arg */
- arg = ScmOp_eval(SCM_CAR(obj), env);
+ /* eval 1st arg */
+ arg = ScmOp_eval(SCM_CAR(obj), env);
- /* check 2nd arg */
- if (SCM_NULLP(SCM_CDR(obj)))
- return SCM_FUNC_EXEC_SUBR2N(tmp, arg, SCM_NIL);
+ /* check 2nd arg */
+ if (SCM_NULLP(SCM_CDR(obj)))
+ return SCM_FUNC_EXEC_SUBR2N(tmp, arg, SCM_NIL);
- /* call proc with each 2 objs */
- for (obj = SCM_CDR(obj); !SCM_NULLP(obj); obj = SCM_CDR(obj)) {
- arg = SCM_FUNC_EXEC_SUBR2N(tmp,
- arg,
- ScmOp_eval(SCM_CAR(obj), env));
- }
- return arg;
- }
+ /* call proc with each 2 objs */
+ for (obj = SCM_CDR(obj); !SCM_NULLP(obj); obj = SCM_CDR(obj)) {
+ arg = SCM_FUNC_EXEC_SUBR2N(tmp,
+ arg,
+ ScmOp_eval(SCM_CAR(obj), env));
+ }
+ return arg;
+ }
case FUNCTYPE_0:
return SCM_FUNC_EXEC_SUBR0(tmp);
case FUNCTYPE_1:
@@ -320,118 +320,120 @@
arg,
ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env)); /* 2nd arg */
}
- case FUNCTYPE_3:
- {
- obj = SCM_CDR(obj);
- arg = ScmOp_eval(SCM_CAR(obj), env); /* 1st arg */
- obj = SCM_CDR(obj);
- return SCM_FUNC_EXEC_SUBR3(tmp,
- arg,
- ScmOp_eval(SCM_CAR(obj), env), /* 2nd arg */
- ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env)); /* 3rd arg */
- }
- case FUNCTYPE_4:
- {
- obj = SCM_CDR(obj);
- arg = ScmOp_eval(SCM_CAR(obj), env); /* 1st arg */
- obj = SCM_CDR(obj);
- return SCM_FUNC_EXEC_SUBR4(tmp,
- arg,
- ScmOp_eval(SCM_CAR(obj), env), /* 2nd arg */
- ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env), /* 3rd arg */
- ScmOp_eval(SCM_CAR(SCM_CDR(SCM_CDR(obj))), env)); /* 4th arg */
- }
- case FUNCTYPE_5:
- {
- obj = SCM_CDR(obj);
- arg = ScmOp_eval(SCM_CAR(obj), env); /* 1st arg */
- obj = SCM_CDR(obj);
- return SCM_FUNC_EXEC_SUBR5(tmp,
- arg,
- ScmOp_eval(SCM_CAR(obj), env), /* 2nd arg */
- ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env), /* 3rd arg */
- ScmOp_eval(SCM_CAR(SCM_CDR(SCM_CDR(obj))), env), /* 4th arg */
- ScmOp_eval(SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(obj)))), env)); /* 5th arg */
+ case FUNCTYPE_3:
+ {
+ obj = SCM_CDR(obj);
+ arg = ScmOp_eval(SCM_CAR(obj), env); /* 1st arg */
+ obj = SCM_CDR(obj);
+ return SCM_FUNC_EXEC_SUBR3(tmp,
+ arg,
+ ScmOp_eval(SCM_CAR(obj), env), /* 2nd arg */
+ ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env)); /* 3rd arg */
+ }
+ case FUNCTYPE_4:
+ {
+ obj = SCM_CDR(obj);
+ arg = ScmOp_eval(SCM_CAR(obj), env); /* 1st arg */
+ obj = SCM_CDR(obj);
+ return SCM_FUNC_EXEC_SUBR4(tmp,
+ arg,
+ ScmOp_eval(SCM_CAR(obj), env), /* 2nd arg */
+ ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env), /* 3rd arg */
+ ScmOp_eval(SCM_CAR(SCM_CDR(SCM_CDR(obj))), env)); /* 4th arg */
+ }
+ case FUNCTYPE_5:
+ {
+ obj = SCM_CDR(obj);
+ arg = ScmOp_eval(SCM_CAR(obj), env); /* 1st arg */
+ obj = SCM_CDR(obj);
+ return SCM_FUNC_EXEC_SUBR5(tmp,
+ arg,
+ ScmOp_eval(SCM_CAR(obj), env), /* 2nd arg */
+ ScmOp_eval(SCM_CAR(SCM_CDR(obj)), env), /* 3rd arg */
+ ScmOp_eval(SCM_CAR(SCM_CDR(SCM_CDR(obj))), env), /* 4th arg */
+ ScmOp_eval(SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(obj)))), env)); /* 5th arg */
- }
+ }
}
break;
- case ScmClosure:
- {
- /*
- * Description of the ScmClosure handling
- *
- * (lambda <formals> <body>)
- *
- * <formals> should have 3 forms.
- *
- * (1) : <variable>
- * (2) : (<variable1> <variable2> ...)
- * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
- */
- arg = SCM_CAR(SCM_CLOSURE_EXP(tmp)); /* arg is <formals> */
+ case ScmClosure:
+ {
+ /*
+ * Description of the ScmClosure handling
+ *
+ * (lambda <formals> <body>)
+ *
+ * <formals> should have 3 forms.
+ *
+ * (1) : <variable>
+ * (2) : (<variable1> <variable2> ...)
+ * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
+ */
+ arg = SCM_CAR(SCM_CLOSURE_EXP(tmp)); /* arg is <formals> */
- if (SCM_SYMBOLP(arg)) {
- /* (1) : <variable> */
- env = extend_environment(Scm_NewCons(arg, SCM_NIL),
- Scm_NewCons(map_eval(SCM_CDR(obj), env),
- SCM_NIL),
- SCM_CLOSURE_ENV(tmp));
- } else if (SCM_CONSP(arg)) {
- /*
- * (2) : (<variable1> <variable2> ...)
- * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
- *
- * - dot list is handled in lookup_frame().
- */
- env = extend_environment(arg,
- map_eval(SCM_CDR(obj), env),
- SCM_CLOSURE_ENV(tmp));
- } else if (SCM_NULLP(arg)) {
- /*
- * (2') : <variable> is '()
- */
- env = SCM_CLOSURE_ENV(tmp);
- } else {
- SigScm_ErrorObj("lambda : bad syntax with ", arg);
- }
+ if (SCM_SYMBOLP(arg)) {
+ /* (1) : <variable> */
+ env = extend_environment(Scm_NewCons(arg, SCM_NIL),
+ Scm_NewCons(map_eval(SCM_CDR(obj), env),
+ SCM_NIL),
+ SCM_CLOSURE_ENV(tmp));
+ } else if (SCM_CONSP(arg)) {
+ /*
+ * (2) : (<variable1> <variable2> ...)
+ * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
+ *
+ * - dot list is handled in lookup_frame().
+ */
+ env = extend_environment(arg,
+ map_eval(SCM_CDR(obj), env),
+ SCM_CLOSURE_ENV(tmp));
+ } else if (SCM_NULLP(arg)) {
+ /*
+ * (2') : <variable> is '()
+ */
+ env = extend_environment(SCM_NIL,
+ SCM_NIL,
+ SCM_CLOSURE_ENV(tmp));
+ } else {
+ SigScm_ErrorObj("lambda : bad syntax with ", arg);
+ }
- /*
- * Notice
- *
- * The return obj of ScmExp_begin is the raw S-expression.
- * So we need to re-evaluate this!.
- */
- obj = ScmExp_begin(SCM_CDR(SCM_CLOSURE_EXP(tmp)), &env, &tail_flag);
- goto eval_loop;
- }
- case ScmContinuation:
- {
+ /*
+ * Notice
+ *
+ * The return obj of ScmExp_begin is the raw S-expression.
+ * So we need to re-evaluate this!.
+ */
+ obj = ScmExp_begin(SCM_CDR(SCM_CLOSURE_EXP(tmp)), &env, &tail_flag);
+ goto eval_loop;
+ }
+ case ScmContinuation:
+ {
/*
- * Description of ScmContinuation handling
- *
+ * Description of ScmContinuation handling
+ *
* (1) eval 1st arg
* (2) store it to global variable "continuation_thrown_obj"
* (3) then longjmp
- *
- * PROBLEM : setjmp/longjmp is stack based operation, so we
- * cannot jump from the bottom of the stack to the top of
- * the stack. Is there any efficient way to implement first
- * class continuation? (TODO).
- */
- obj = SCM_CAR(SCM_CDR(obj));
- continuation_thrown_obj = ScmOp_eval(obj, env);
- longjmp(SCM_CONTINUATION_JMPENV(tmp), 1);
- }
- break;
- case ScmEtc:
- if (EQ(tmp, SCM_QUOTE)) {
- return SCM_CDR(obj);
- }
- if (EQ(tmp, SCM_QUASIQUOTE)) {
- return eval_unquote(SCM_CDR(obj), env);
- }
- return tmp;
+ *
+ * PROBLEM : setjmp/longjmp is stack based operation, so we
+ * cannot jump from the bottom of the stack to the top of
+ * the stack. Is there any efficient way to implement first
+ * class continuation? (TODO).
+ */
+ obj = SCM_CAR(SCM_CDR(obj));
+ continuation_thrown_obj = ScmOp_eval(obj, env);
+ longjmp(SCM_CONTINUATION_JMPENV(tmp), 1);
+ }
+ break;
+ case ScmEtc:
+ if (EQ(tmp, SCM_QUOTE)) {
+ return SCM_CDR(obj);
+ }
+ if (EQ(tmp, SCM_QUASIQUOTE)) {
+ return eval_unquote(SCM_CDR(obj), env);
+ }
+ return tmp;
default:
/* What? */
SigScm_ErrorObj("eval : What type of function? ", arg);
@@ -453,7 +455,7 @@
/* sanity check */
if CHECK_2_ARGS(args)
- SigScm_Error("apply : Wrong number of arguments\n");
+ SigScm_Error("apply : Wrong number of arguments\n");
/* 1st elem of list is proc */
proc = SCM_CAR(args);
@@ -463,130 +465,132 @@
/* apply proc */
switch (SCM_GETTYPE(proc)) {
- case ScmFunc:
- switch (SCM_FUNC_NUMARG(proc)) {
- case FUNCTYPE_L:
- {
- return SCM_FUNC_EXEC_SUBRL(proc,
- obj,
- env);
- }
- case FUNCTYPE_2N:
- {
- args = obj;
+ case ScmFunc:
+ switch (SCM_FUNC_NUMARG(proc)) {
+ case FUNCTYPE_L:
+ {
+ return SCM_FUNC_EXEC_SUBRL(proc,
+ obj,
+ env);
+ }
+ case FUNCTYPE_2N:
+ {
+ args = obj;
- /* check 1st arg */
- if (SCM_NULLP(args))
- return SCM_FUNC_EXEC_SUBR2N(proc, SCM_NIL, SCM_NIL);
+ /* check 1st arg */
+ if (SCM_NULLP(args))
+ return SCM_FUNC_EXEC_SUBR2N(proc, SCM_NIL, SCM_NIL);
- /* eval 1st arg */
- obj = SCM_CAR(args);
+ /* eval 1st arg */
+ obj = SCM_CAR(args);
- /* check 2nd arg */
- if (SCM_NULLP(SCM_CDR(args)))
- return SCM_FUNC_EXEC_SUBR2N(proc, obj, SCM_NIL);
+ /* check 2nd arg */
+ if (SCM_NULLP(SCM_CDR(args)))
+ return SCM_FUNC_EXEC_SUBR2N(proc, obj, SCM_NIL);
- /* call proc with each 2 objs */
- for (args = SCM_CDR(args); !SCM_NULLP(args); args = SCM_CDR(args)) {
- obj = SCM_FUNC_EXEC_SUBR2N(proc,
- obj,
- SCM_CAR(args));
- }
- return obj;
- }
- case FUNCTYPE_0:
- {
- return SCM_FUNC_EXEC_SUBR0(proc);
- }
- case FUNCTYPE_1:
- {
- return SCM_FUNC_EXEC_SUBR1(proc,
- SCM_CAR(obj));
- }
- case FUNCTYPE_2:
- {
- return SCM_FUNC_EXEC_SUBR2(proc,
- SCM_CAR(obj),
- SCM_CAR(SCM_CDR(obj)));
- }
- case FUNCTYPE_3:
- {
- return SCM_FUNC_EXEC_SUBR3(proc,
- SCM_CAR(obj),
- SCM_CAR(SCM_CDR(obj)),
- SCM_CAR(SCM_CDR(SCM_CDR(obj))));
- }
- case FUNCTYPE_4:
- {
- return SCM_FUNC_EXEC_SUBR4(proc,
- SCM_CAR(obj),
- SCM_CAR(SCM_CDR(obj)),
- SCM_CAR(SCM_CDR(SCM_CDR(obj))),
- SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(obj)))));
- }
- case FUNCTYPE_5:
- {
- return SCM_FUNC_EXEC_SUBR5(proc,
- SCM_CAR(obj),
- SCM_CAR(SCM_CDR(obj)),
- SCM_CAR(SCM_CDR(SCM_CDR(obj))),
- SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(obj)))),
- SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(SCM_CDR(obj))))));
- }
- default:
- SigScm_ErrorObj("apply : invalid application ", proc);
- }
- break;
- case ScmClosure:
- {
- /*
- * Description of the ScmClosure handling
- *
- * (lambda <formals> <body>)
- *
- * <formals> should have 3 forms.
- *
- * (1) : <variable>
- * (2) : (<variable1> <variable2> ...)
- * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
- */
- args = SCM_CAR(SCM_CLOSURE_EXP(proc)); /* arg is <formals> */
+ /* call proc with each 2 objs */
+ for (args = SCM_CDR(args); !SCM_NULLP(args); args = SCM_CDR(args)) {
+ obj = SCM_FUNC_EXEC_SUBR2N(proc,
+ obj,
+ SCM_CAR(args));
+ }
+ return obj;
+ }
+ case FUNCTYPE_0:
+ {
+ return SCM_FUNC_EXEC_SUBR0(proc);
+ }
+ case FUNCTYPE_1:
+ {
+ return SCM_FUNC_EXEC_SUBR1(proc,
+ SCM_CAR(obj));
+ }
+ case FUNCTYPE_2:
+ {
+ return SCM_FUNC_EXEC_SUBR2(proc,
+ SCM_CAR(obj),
+ SCM_CAR(SCM_CDR(obj)));
+ }
+ case FUNCTYPE_3:
+ {
+ return SCM_FUNC_EXEC_SUBR3(proc,
+ SCM_CAR(obj),
+ SCM_CAR(SCM_CDR(obj)),
+ SCM_CAR(SCM_CDR(SCM_CDR(obj))));
+ }
+ case FUNCTYPE_4:
+ {
+ return SCM_FUNC_EXEC_SUBR4(proc,
+ SCM_CAR(obj),
+ SCM_CAR(SCM_CDR(obj)),
+ SCM_CAR(SCM_CDR(SCM_CDR(obj))),
+ SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(obj)))));
+ }
+ case FUNCTYPE_5:
+ {
+ return SCM_FUNC_EXEC_SUBR5(proc,
+ SCM_CAR(obj),
+ SCM_CAR(SCM_CDR(obj)),
+ SCM_CAR(SCM_CDR(SCM_CDR(obj))),
+ SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(obj)))),
+ SCM_CAR(SCM_CDR(SCM_CDR(SCM_CDR(SCM_CDR(obj))))));
+ }
+ default:
+ SigScm_ErrorObj("apply : invalid application ", proc);
+ }
+ break;
+ case ScmClosure:
+ {
+ /*
+ * Description of the ScmClosure handling
+ *
+ * (lambda <formals> <body>)
+ *
+ * <formals> should have 3 forms.
+ *
+ * (1) : <variable>
+ * (2) : (<variable1> <variable2> ...)
+ * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
+ */
+ args = SCM_CAR(SCM_CLOSURE_EXP(proc)); /* arg is <formals> */
- if (SCM_SYMBOLP(args)) {
- /* (1) : <variable> */
- env = extend_environment(Scm_NewCons(args, SCM_NIL),
- Scm_NewCons(obj, SCM_NIL),
- SCM_CLOSURE_ENV(proc));
- } else if (SCM_CONSP(args)) {
- /*
- * (2) : (<variable1> <variable2> ...)
- * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
- *
- * - dot list is handled in lookup_frame().
- */
- env = extend_environment(args,
- obj,
- SCM_CLOSURE_ENV(proc));
- } else if (SCM_NULLP(args)) {
- /*
- * (2') : <variable> is '()
- */
- env = SCM_CLOSURE_ENV(proc);
- } else {
- SigScm_ErrorObj("lambda : bad syntax with ", args);
- }
+ if (SCM_SYMBOLP(args)) {
+ /* (1) : <variable> */
+ env = extend_environment(Scm_NewCons(args, SCM_NIL),
+ Scm_NewCons(obj, SCM_NIL),
+ SCM_CLOSURE_ENV(proc));
+ } else if (SCM_CONSP(args)) {
+ /*
+ * (2) : (<variable1> <variable2> ...)
+ * (3) : (<variable1> <variable2> ... <variable n-1> . <variable n>)
+ *
+ * - dot list is handled in lookup_frame().
+ */
+ env = extend_environment(args,
+ obj,
+ SCM_CLOSURE_ENV(proc));
+ } else if (SCM_NULLP(args)) {
+ /*
+ * (2') : <variable> is '()
+ */
+ env = extend_environment(SCM_NIL,
+ SCM_NIL,
+ SCM_CLOSURE_ENV(proc));
+ } else {
+ SigScm_ErrorObj("lambda : bad syntax with ", args);
+ }
- /*
- * Notice
- *
- * The return obj of ScmExp_begin is the raw S-expression.
- * So we need to re-evaluate this!.
- */
- obj = ScmExp_begin(SCM_CDR(SCM_CLOSURE_EXP(proc)), &env, &tail_flag);
- return ScmOp_eval(obj, env);
- }
- default:
- SigScm_ErrorObj("apply : invalid application ", args);
+ /*
+ * Notice
+ *
+ * The return obj of ScmExp_begin is the raw S-expression.
+ * So we need to re-evaluate this!.
+ */
+ obj = ScmExp_begin(SCM_CDR(SCM_CLOSURE_EXP(proc)), &env, &tail_flag);
+ return ScmOp_eval(obj, env);
+ }
+ default:
+ SigScm_ErrorObj("apply : invalid application ", args);
}
/* never reaches here */
@@ -600,7 +604,7 @@
/* sanity check */
if (!SCM_SYMBOLP(var))
- SigScm_ErrorObj("symbol_value : not symbol : ", var);
+ SigScm_ErrorObj("symbol_value : not symbol : ", var);
/* first, lookup the environment */
val = lookup_environment(var, env);
@@ -640,9 +644,9 @@
tail = result;
newtail = SCM_NIL;
for (args = SCM_CDR(args); !SCM_NULLP(args); args = SCM_CDR(args)) {
- newtail = Scm_NewCons(ScmOp_eval(SCM_CAR(args), env), SCM_NIL);
- SCM_SETCDR(tail, newtail);
- tail = newtail;
+ newtail = Scm_NewCons(ScmOp_eval(SCM_CAR(args), env), SCM_NIL);
+ SCM_SETCDR(tail, newtail);
+ tail = newtail;
}
return result;
@@ -666,38 +670,38 @@
/* scanning list */
for (; !SCM_NULLP(list); list = SCM_CDR(list))
{
- obj = SCM_CAR(list);
+ obj = SCM_CAR(list);
- /* handle quotes */
- if (SCM_CONSP(obj)) {
- /* handle nested SCM_QUASIQUOTE(`) */
- if (EQ(SCM_CDR(obj), SCM_QUASIQUOTE)) {
- continue; /* left untouched */
- }
+ /* handle quotes */
+ if (SCM_CONSP(obj)) {
+ /* handle nested SCM_QUASIQUOTE(`) */
+ if (EQ(SCM_CDR(obj), SCM_QUASIQUOTE)) {
+ continue; /* left untouched */
+ }
- /* handle SCM_UNQUOTE(,) */
- if (EQ(SCM_CAR(obj), SCM_UNQUOTE)) {
- SCM_SETCAR(list, ScmOp_eval(SCM_CDR(obj), env));
- }
+ /* handle SCM_UNQUOTE(,) */
+ if (EQ(SCM_CAR(obj), SCM_UNQUOTE)) {
+ SCM_SETCAR(list, ScmOp_eval(SCM_CDR(obj), env));
+ }
- /* handle SCM_UNQUOTE_SPLICING(,@) */
- if (EQ(SCM_CAR(obj), SCM_UNQUOTE_SPLICING)) {
- obj = ScmOp_eval(SCM_CDR(obj), env);
+ /* handle SCM_UNQUOTE_SPLICING(,@) */
+ if (EQ(SCM_CAR(obj), SCM_UNQUOTE_SPLICING)) {
+ obj = ScmOp_eval(SCM_CDR(obj), env);
- if (SCM_NULLP(obj)) {
- SCM_SETCDR(prev, SCM_CDR(SCM_CDR(prev)));
- continue;
- }
+ if (SCM_NULLP(obj)) {
+ SCM_SETCDR(prev, SCM_CDR(SCM_CDR(prev)));
+ continue;
+ }
- if (!SCM_CONSP(obj))
- SigScm_Error("invalid unquote-splicing (,@)\n");
+ if (!SCM_CONSP(obj))
+ SigScm_Error("invalid unquote-splicing (,@)\n");
- SCM_SETCDR(ScmOp_last_pair(obj), SCM_CDR(SCM_CDR(prev)));
- SCM_SETCDR(prev, obj);
- }
- }
+ SCM_SETCDR(ScmOp_last_pair(obj), SCM_CDR(SCM_CDR(prev)));
+ SCM_SETCDR(prev, obj);
+ }
+ }
- prev = list;
+ prev = list;
}
return args;
@@ -707,9 +711,9 @@
{
/* sanity check */
if (SCM_NULLP(list))
- return SCM_NIL;
+ return SCM_NIL;
if (!SCM_CONSP(list))
- SigScm_ErrorObj("last_pair : list required but got ", list);
+ SigScm_ErrorObj("last_pair : list required but got ", list);
while (1) {
if (!SCM_CONSP(list) || SCM_NULLP(SCM_CDR(list)))
@@ -745,7 +749,7 @@
(*tail_flag) = 0;
if CHECK_2_ARGS(exp)
- SigScm_Error("lambda : too few argument\n");
+ SigScm_Error("lambda : too few argument\n");
return Scm_NewClosure(exp, env);
}
@@ -764,21 +768,21 @@
/* sanity check */
if (SCM_NULLP(exp) || SCM_NULLP(SCM_CDR(exp)))
- SigScm_Error("if : syntax error\n");
+ SigScm_Error("if : syntax error\n");
/* eval predicates */
pred = ScmOp_eval(SCM_CAR(exp), env);
/* if pred is SCM_TRUE */
if (!EQ(pred, SCM_FALSE)) {
- /* doesn't evaluate now for tail-recursion. */
- return SCM_CAR(SCM_CDR(exp));
+ /* doesn't evaluate now for tail-recursion. */
+ return SCM_CAR(SCM_CDR(exp));
}
/* if pred is SCM_FALSE */
false_exp = SCM_CDR(SCM_CDR(exp));
if (SCM_NULLP(false_exp))
- return SCM_UNDEF;
+ return SCM_UNDEF;
/* doesn't evaluate now for tail-recursion. */
return SCM_CAR(false_exp);
@@ -799,22 +803,22 @@
(*tail_flag) = 0;
if (SCM_NULLP(val))
- SigScm_Error("set! : syntax error\n");
+ SigScm_Error("set! : syntax error\n");
ret = ScmOp_eval(val, env);
tmp = lookup_environment(sym, env);
if (SCM_NULLP(tmp)) {
- /*
- * not found in the environment
- * if symbol is not bounded, error occurs
- */
- if (EQ(ScmOp_boundp(sym), SCM_FALSE))
- SigScm_ErrorObj("set! : unbound variable ", sym);
+ /*
+ * not found in the environment
+ * if symbol is not bounded, error occurs
+ */
+ if (EQ(ScmOp_boundp(sym), SCM_FALSE))
+ SigScm_ErrorObj("set! : unbound variable ", sym);
- SCM_SETSYMBOL_VCELL(sym, ret);
+ SCM_SETSYMBOL_VCELL(sym, ret);
} else {
- /* found in the environment*/
- SCM_SETCAR(tmp, ret);
+ /* found in the environment*/
+ SCM_SETCAR(tmp, ret);
}
return ret;
@@ -849,44 +853,44 @@
/* looping in each clause */
for (; !SCM_NULLP(arg); arg = SCM_CDR(arg)) {
- clause = SCM_CAR(arg);
- test = SCM_CAR(clause);
- exps = SCM_CDR(clause);
+ clause = SCM_CAR(arg);
+ test = SCM_CAR(clause);
+ exps = SCM_CDR(clause);
- if (SCM_NULLP(clause) || SCM_NULLP(test))
- SigScm_Error("cond : syntax error\n");
+ if (SCM_NULLP(clause) || SCM_NULLP(test))
+ SigScm_Error("cond : syntax error\n");
- /* evaluate test */
- test = ScmOp_eval(test, env);
+ /* evaluate test */
+ test = ScmOp_eval(test, env);
- /* check the result */
- if (!SCM_EQ(test, SCM_FALSE)) {
- /*
- * if the selected <clause> contains only the <test> and no <expression>s,
- * then the value of the <test> is returned as the result.
- */
- if (SCM_NULLP(exps))
- return test;
+ /* check the result */
+ if (!SCM_EQ(test, SCM_FALSE)) {
+ /*
+ * if the selected <clause> contains only the <test> and no <expression>s,
+ * then the value of the <test> is returned as the result.
+ */
+ if (SCM_NULLP(exps))
+ return test;
- /*
- * If the selected <clause> uses the => alternate form, then the <expression>
- * is evaluated. Its value must be a procedure that accepts one argument;
- * this procedure is then called on the value of the <test> and the value
- * returned by this procedure is returned by the cond expression.
- */
- if (SCM_EQ(Scm_Intern("=>"), SCM_CAR(exps))) {
- proc = ScmOp_eval(SCM_CAR(SCM_CDR(exps)), env);
- if (EQ(ScmOp_procedurep(proc), SCM_FALSE))
- SigScm_ErrorObj("cond : the value of exp after => must be the procedure but got ", proc);
-
- return ScmOp_apply(Scm_NewCons(proc,
- Scm_NewCons(Scm_NewCons(test, SCM_NIL),
- SCM_NIL)),
- env);
- }
-
- return ScmExp_begin(exps, &env, tail_flag);
- }
+ /*
+ * If the selected <clause> uses the => alternate form, then the <expression>
+ * is evaluated. Its value must be a procedure that accepts one argument;
+ * this procedure is then called on the value of the <test> and the value
+ * returned by this procedure is returned by the cond expression.
+ */
+ if (SCM_EQ(Scm_Intern("=>"), SCM_CAR(exps))) {
+ proc = ScmOp_eval(SCM_CAR(SCM_CDR(exps)), env);
+ if (EQ(ScmOp_procedurep(proc), SCM_FALSE))
+ SigScm_ErrorObj("cond : the value of exp after => must be the procedure but got ", proc);
+
+ return ScmOp_apply(Scm_NewCons(proc,
+ Scm_NewCons(Scm_NewCons(test, SCM_NIL),
+ SCM_NIL)),
+ env);
+ }
+
+ return ScmExp_begin(exps, &env, tail_flag);
+ }
}
return SCM_UNSPECIFIED;
@@ -902,22 +906,22 @@
/* looping in each clause */
for (arg = SCM_CDR(arg); !SCM_NULLP(arg); arg = SCM_CDR(arg)) {
- clause = SCM_CAR(arg);
- datums = SCM_CAR(clause);
- exps = SCM_CDR(clause);
- if (SCM_NULLP(clause) || SCM_NULLP(datums) || SCM_NULLP(exps))
- SigScm_Error("case : syntax error\n");
+ clause = SCM_CAR(arg);
+ datums = SCM_CAR(clause);
+ exps = SCM_CDR(clause);
+ if (SCM_NULLP(clause) || SCM_NULLP(datums) || SCM_NULLP(exps))
+ SigScm_Error("case : syntax error\n");
- /* check "else" symbol */
- if (SCM_NULLP(SCM_CDR(arg)) && !SCM_CONSP(datums) && EQ(SCM_SYMBOL_VCELL(datums), SCM_TRUE))
- return ScmExp_begin(exps, &env, tail_flag);
+ /* check "else" symbol */
+ if (SCM_NULLP(SCM_CDR(arg)) && !SCM_CONSP(datums) && EQ(SCM_SYMBOL_VCELL(datums), SCM_TRUE))
+ return ScmExp_begin(exps, &env, tail_flag);
- /* evaluate datums and compare to key by eqv? */
- for (; !SCM_NULLP(datums); datums = SCM_CDR(datums)) {
- if (EQ(ScmOp_eqvp(SCM_CAR(datums), key), SCM_TRUE)) {
- return ScmExp_begin(exps, &env, tail_flag);
- }
- }
+ /* evaluate datums and compare to key by eqv? */
+ for (; !SCM_NULLP(datums); datums = SCM_CDR(datums)) {
+ if (EQ(ScmOp_eqvp(SCM_CAR(datums), key), SCM_TRUE)) {
+ return ScmExp_begin(exps, &env, tail_flag);
+ }
+ }
}
return SCM_UNSPECIFIED;
@@ -930,30 +934,30 @@
/* sanity check */
if (SCM_NULLP(arg))
- return SCM_TRUE;
+ return SCM_TRUE;
if (EQ(ScmOp_listp(arg), SCM_FALSE))
- SigScm_ErrorObj("and : list required but got ", arg);
+ SigScm_ErrorObj("and : list required but got ", arg);
/* check recursively */
for (; !SCM_NULLP(arg); arg = SCM_CDR(arg)) {
- obj = SCM_CAR(arg);
+ obj = SCM_CAR(arg);
- /* return last item */
- if (SCM_NULLP(SCM_CDR(arg))) {
- /* set tail_flag */
- (*tail_flag) = 1;
+ /* return last item */
+ if (SCM_NULLP(SCM_CDR(arg))) {
+ /* set tail_flag */
+ (*tail_flag) = 1;
- return obj;
- }
+ return obj;
+ }
- /* evaluate obj */
- obj = ScmOp_eval(obj, env);
- if (EQ(obj, SCM_FALSE)) {
- /* set tail_flag */
- (*tail_flag) = 0;
+ /* evaluate obj */
+ obj = ScmOp_eval(obj, env);
+ if (EQ(obj, SCM_FALSE)) {
+ /* set tail_flag */
+ (*tail_flag) = 0;
- return SCM_FALSE;
- }
+ return SCM_FALSE;
+ }
}
return SCM_NIL;
@@ -966,29 +970,29 @@
/* sanity check */
if (SCM_NULLP(arg))
- return SCM_FALSE;
+ return SCM_FALSE;
if (EQ(ScmOp_listp(arg), SCM_FALSE))
- SigScm_ErrorObj("or : list required but got ", arg);
+ SigScm_ErrorObj("or : list required but got ", arg);
/* check recursively */
for (; !SCM_NULLP(arg); arg = SCM_CDR(arg)) {
- obj = SCM_CAR(arg);
+ obj = SCM_CAR(arg);
- /* return last item */
- if (SCM_NULLP(SCM_CDR(arg))) {
- /* set tail_flag */
- (*tail_flag) = 1;
+ /* return last item */
+ if (SCM_NULLP(SCM_CDR(arg))) {
+ /* set tail_flag */
+ (*tail_flag) = 1;
- return obj;
- }
+ return obj;
+ }
- obj = ScmOp_eval(obj, env);
- if (!EQ(obj, SCM_FALSE)) {
- /* set tail_flag */
- (*tail_flag) = 0;
+ obj = ScmOp_eval(obj, env);
+ if (!EQ(obj, SCM_FALSE)) {
+ /* set tail_flag */
+ (*tail_flag) = 0;
- return obj;
- }
+ return obj;
+ }
}
@@ -1009,11 +1013,11 @@
/* sanity check */
if CHECK_2_ARGS(arg)
- SigScm_Error("let : syntax error\n");
+ SigScm_Error("let : syntax error\n");
/* guess whether syntax is "Named let" */
if (SCM_SYMBOLP(SCM_CAR(arg)))
- goto named_let;
+ goto named_let;
/* get bindings and body */
bindings = SCM_CAR(arg);
@@ -1026,17 +1030,17 @@
...)
========================================================================*/
if (SCM_CONSP(bindings) || SCM_NULLP(bindings)) {
- for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
- binding = SCM_CAR(bindings);
- vars = Scm_NewCons(SCM_CAR(binding), vars);
- vals = Scm_NewCons(ScmOp_eval(SCM_CAR(SCM_CDR(binding)), env), vals);
- }
+ for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
+ binding = SCM_CAR(bindings);
+ vars = Scm_NewCons(SCM_CAR(binding), vars);
+ vals = Scm_NewCons(ScmOp_eval(SCM_CAR(SCM_CDR(binding)), env), vals);
+ }
- /* create new environment for */
- env = extend_environment(vars, vals, env);
- *envp = env;
+ /* create new environment for */
+ env = extend_environment(vars, vals, env);
+ *envp = env;
- return ScmExp_begin(body, &env, tail_flag);
+ return ScmExp_begin(body, &env, tail_flag);
}
return ScmExp_begin(body, &env, tail_flag);
@@ -1051,9 +1055,9 @@
bindings = SCM_CAR(SCM_CDR(arg));
body = SCM_CDR(SCM_CDR(arg));
for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
- binding = SCM_CAR(bindings);
- vars = Scm_NewCons(SCM_CAR(binding), vars);
- vals = Scm_NewCons(SCM_CAR(SCM_CDR(binding)), vals);
+ binding = SCM_CAR(bindings);
+ vars = Scm_NewCons(SCM_CAR(binding), vars);
+ vals = Scm_NewCons(SCM_CAR(SCM_CDR(binding)), vals);
}
vars = ScmOp_reverse(vars);
@@ -1061,9 +1065,9 @@
/* (define (<variable> <variable1> <variable2> ...>) <body>) */
ScmExp_define(Scm_NewCons(Scm_NewCons(SCM_CAR(arg),
- vars),
- body),
- &env, tail_flag);
+ vars),
+ body),
+ &env, tail_flag);
/* set tail_flag */
(*tail_flag) = 1;
@@ -1083,7 +1087,7 @@
/* sanity check */
if CHECK_2_ARGS(arg)
- SigScm_Error("let* : syntax error\n");
+ SigScm_Error("let* : syntax error\n");
/* get bindings and body */
bindings = SCM_CAR(arg);
@@ -1096,28 +1100,28 @@
...)
========================================================================*/
if (SCM_CONSP(bindings)) {
- for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
- binding = SCM_CAR(bindings);
- vars = Scm_NewCons(SCM_CAR(binding), SCM_NIL);
- vals = Scm_NewCons(ScmOp_eval(SCM_CAR(SCM_CDR(binding)), env), SCM_NIL);
+ for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
+ binding = SCM_CAR(bindings);
+ vars = Scm_NewCons(SCM_CAR(binding), SCM_NIL);
+ vals = Scm_NewCons(ScmOp_eval(SCM_CAR(SCM_CDR(binding)), env), SCM_NIL);
- /* add env to each time!*/
- env = extend_environment(vars, vals, env);
- }
- /* set new env */
- *envp = env;
- /* evaluate */
- return ScmExp_begin(body, &env, tail_flag);
+ /* add env to each time!*/
+ env = extend_environment(vars, vals, env);
+ }
+ /* set new env */
+ *envp = env;
+ /* evaluate */
+ return ScmExp_begin(body, &env, tail_flag);
} else if (SCM_NULLP(bindings)) {
- /* extend null environment */
- env = extend_environment(Scm_NewCons(SCM_NIL, SCM_NIL),
- Scm_NewCons(SCM_NIL, SCM_NIL),
- env);
+ /* extend null environment */
+ env = extend_environment(SCM_NIL,
+ SCM_NIL,
+ env);
- /* set new env */
- *envp = env;
- /* evaluate */
- return ScmExp_begin(body, &env, tail_flag);
+ /* set new env */
+ *envp = env;
+ /* evaluate */
+ return ScmExp_begin(body, &env, tail_flag);
}
/* set tail_flag */
@@ -1140,7 +1144,7 @@
/* sanity check */
if (SCM_NULLP(arg) || SCM_NULLP(SCM_CDR(arg)))
- SigScm_Error("letrec : syntax error\n");
+ SigScm_Error("letrec : syntax error\n");
/* get bindings and body */
bindings = SCM_CAR(arg);
@@ -1153,36 +1157,36 @@
...)
========================================================================*/
if (SCM_CONSP(bindings) || SCM_NULLP(bindings)) {
- for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
- binding = SCM_CAR(bindings);
- var = SCM_CAR(binding);
- val = SCM_CAR(SCM_CDR(binding));
+ for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
+ binding = SCM_CAR(bindings);
+ var = SCM_CAR(binding);
+ val = SCM_CAR(SCM_CDR(binding));
- /* construct vars and vals list */
- vars = Scm_NewCons(var, vars);
- vals = Scm_NewCons(val, vals);
- }
+ /* construct vars and vals list */
+ vars = Scm_NewCons(var, vars);
+ vals = Scm_NewCons(val, vals);
+ }
- /* construct new frame for letrec_env */
- frame = Scm_NewCons(vars, vals);
- letrec_env = Scm_NewCons(frame, letrec_env);
+ /* construct new frame for letrec_env */
+ frame = Scm_NewCons(vars, vals);
+ letrec_env = Scm_NewCons(frame, letrec_env);
- /* extend environment by letrec_env */
- env = extend_environment(SCM_CAR(frame), SCM_CDR(frame), env);
+ /* extend environment by letrec_env */
+ env = extend_environment(SCM_CAR(frame), SCM_CDR(frame), env);
- /* ok, vars of letrec is extended to env */
- letrec_env = SCM_NIL;
+ /* ok, vars of letrec is extended to env */
+ letrec_env = SCM_NIL;
- /* set new env */
- *envp = env;
+ /* set new env */
+ *envp = env;
- /* evaluate vals */
- for (; !SCM_NULLP(vals); vals = SCM_CDR(vals)) {
- SCM_SETCAR(vals, ScmOp_eval(SCM_CAR(vals), env));
- }
-
- /* evaluate body */
- return ScmExp_begin(body, &env, tail_flag);
+ /* evaluate vals */
+ for (; !SCM_NULLP(vals); vals = SCM_CDR(vals)) {
+ SCM_SETCAR(vals, ScmOp_eval(SCM_CAR(vals), env));
+ }
+
+ /* evaluate body */
+ return ScmExp_begin(body, &env, tail_flag);
}
/* set tail_flag */
@@ -1200,29 +1204,31 @@
{
ScmObj env = *envp;
ScmObj exp = SCM_NIL;
-
+
/* set tail_flag */
(*tail_flag) = 1;
/* sanity check */
if (SCM_NULLP(arg))
- return SCM_UNDEF;
+ return SCM_UNDEF;
if (EQ(ScmOp_listp(arg), SCM_FALSE))
- SigScm_ErrorObj("begin : list required but got ", arg);
+ SigScm_ErrorObj("begin : list required but got ", arg);
/* eval recursively */
for (; !SCM_NULLP(arg); arg = SCM_CDR(arg)) {
- exp = SCM_CAR(arg);
+ exp = SCM_CAR(arg);
- /* return last expression's result */
- if (EQ(SCM_CDR(arg), SCM_NIL)) {
- *envp = env;
+ /* return last expression's result */
+ if (EQ(SCM_CDR(arg), SCM_NIL)) {
+ /* doesn't evaluate exp now for tail-recursion. */
+ return exp;
+ }
- /* doesn't evaluate exp now for tail-recursion. */
- return exp;
- }
+ /* evaluate exp */
+ ScmOp_eval(exp, env);
- ScmOp_eval(exp, env);
+ /* set new env */
+ *envp = env;
}
/* set tail_flag */
@@ -1260,20 +1266,20 @@
/* sanity check */
if (SCM_INT_VALUE(ScmOp_length(arg)) < 2)
- SigScm_Error("do : syntax error\n");
+ SigScm_Error("do : syntax error\n");
/* construct Environment and steps */
for (; !SCM_NULLP(bindings); bindings = SCM_CDR(bindings)) {
- binding = SCM_CAR(bindings);
- vars = Scm_NewCons(SCM_CAR(binding), vars);
- vals = Scm_NewCons(ScmOp_eval(SCM_CAR(SCM_CDR(binding)), env), vals);
+ binding = SCM_CAR(bindings);
+ vars = Scm_NewCons(SCM_CAR(binding), vars);
+ vals = Scm_NewCons(ScmOp_eval(SCM_CAR(SCM_CDR(binding)), env), vals);
- /* append <step> to steps */
- step = SCM_CDR(SCM_CDR(binding));
- if (SCM_NULLP(step))
- steps = Scm_NewCons(SCM_CAR(binding), steps);
- else
- steps = Scm_NewCons(SCM_CAR(step), steps);
+ /* append <step> to steps */
+ step = SCM_CDR(SCM_CDR(binding));
+ if (SCM_NULLP(step))
+ steps = Scm_NewCons(SCM_CAR(binding), steps);
+ else
+ steps = Scm_NewCons(SCM_CAR(step), steps);
}
/* now extend environment */
@@ -1289,31 +1295,31 @@
/* now excution phase! */
while (SCM_EQ(ScmOp_eval(test, env), SCM_FALSE)) {
- /* execute commands */
- ScmOp_eval(ScmExp_begin(commands, &env, tail_flag), env);
+ /* execute commands */
+ ScmOp_eval(ScmExp_begin(commands, &env, tail_flag), env);
- /*
- * Notice
- *
- * the result of the execution of <step>s must not depend on each other's
- * results. each excution must be done independently. So, we store the
- * results to the "vals" variable and set it in hand.
- */
- vals = SCM_NIL;
- for (tmp_steps = steps; !SCM_NULLP(tmp_steps); tmp_steps = SCM_CDR(tmp_steps)) {
- vals = Scm_NewCons(ScmOp_eval(SCM_CAR(tmp_steps), env), vals);
- }
- vals = ScmOp_reverse(vals);
+ /*
+ * Notice
+ *
+ * the result of the execution of <step>s must not depend on each other's
+ * results. each excution must be done independently. So, we store the
+ * results to the "vals" variable and set it in hand.
+ */
+ vals = SCM_NIL;
+ for (tmp_steps = steps; !SCM_NULLP(tmp_steps); tmp_steps = SCM_CDR(tmp_steps)) {
+ vals = Scm_NewCons(ScmOp_eval(SCM_CAR(tmp_steps), env), vals);
+ }
+ vals = ScmOp_reverse(vals);
- /* set it */
- for (tmp_vars = vars; !SCM_NULLP(tmp_vars) && !SCM_NULLP(vals); tmp_vars = SCM_CDR(tmp_vars), vals = SCM_CDR(vals)) {
- obj = lookup_environment(SCM_CAR(tmp_vars), env);
- if (!SCM_NULLP(obj)) {
- SCM_SETCAR(obj, SCM_CAR(vals));
- } else {
- SigScm_Error("do : broken env\n");
- }
- }
+ /* set it */
+ for (tmp_vars = vars; !SCM_NULLP(tmp_vars) && !SCM_NULLP(vals); tmp_vars = SCM_CDR(tmp_vars), vals = SCM_CDR(vals)) {
+ obj = lookup_environment(SCM_CAR(tmp_vars), env);
+ if (!SCM_NULLP(obj)) {
+ SCM_SETCAR(obj, SCM_CAR(vals));
+ } else {
+ SigScm_Error("do : broken env\n");
+ }
+ }
}
/* set new env */
@@ -1374,32 +1380,24 @@
/* sanity check */
if (SCM_NULLP(var))
- SigScm_ErrorObj("define : syntax error ", arg);
+ SigScm_ErrorObj("define : syntax error ", arg);
/*========================================================================
(define <variable> <expression>)
========================================================================*/
if (SCM_SYMBOLP(var)) {
- if (SCM_NULLP(env)) {
- /* given NIL environment */
- SCM_SETSYMBOL_VCELL(var, ScmOp_eval(body, env));
- } else {
- /* lookup environment */
- val = lookup_environment(var, env);
+ if (SCM_NULLP(env)) {
+ /* given NIL environment */
+ SCM_SETSYMBOL_VCELL(var, ScmOp_eval(body, env));
+ } else {
+ /* add val to the environment */
+ env = add_environment(var, ScmOp_eval(body, env), env);
+ }
- if (!SCM_NULLP(val)) {
- /* found in the environment. set the new variable in env. */
- SCM_SETCAR(val, ScmOp_eval(body, env));
- } else {
- /* add to environment (not create new frame) */
- env = add_environment(var, ScmOp_eval(body, env), env);
- }
- }
+ /* set new env */
+ *envp = env;
- /* set new env */
- *envp = env;
-
- return var;
+ return var;
}
/*========================================================================
@@ -1415,15 +1413,15 @@
(lambda <formals> <body>))
========================================================================*/
if (SCM_CONSP(var)) {
- val = SCM_CAR(var);
- formals = SCM_CDR(var);
- body = SCM_CDR(arg);
+ val = SCM_CAR(var);
+ formals = SCM_CDR(var);
+ body = SCM_CDR(arg);
- /* (val (lambda formals body)) */
- arg = Scm_NewCons(val, Scm_NewCons(ScmExp_lambda(Scm_NewCons(formals, body), &env, tail_flag),
- SCM_NIL));
+ /* (val (lambda formals body)) */
+ arg = Scm_NewCons(val, Scm_NewCons(ScmExp_lambda(Scm_NewCons(formals, body), &env, tail_flag),
+ SCM_NIL));
- return ScmExp_define(arg, &env, tail_flag);
+ return ScmExp_define(arg, &env, tail_flag);
}
SigScm_ErrorObj("define : syntax error ", arg);
Modified: branches/r5rs/sigscheme/test/test-apply.scm
===================================================================
--- branches/r5rs/sigscheme/test/test-apply.scm 2005-08-12 15:02:10 UTC (rev 1189)
+++ branches/r5rs/sigscheme/test/test-apply.scm 2005-08-12 16:59:11 UTC (rev 1190)
@@ -5,7 +5,7 @@
(assert-eq? "apply check2" 6 (apply + `(1 2 ,(+ 1 2))))
(assert-equal? "apply check3" '(3) (apply cddr '((1 2 3))))
(assert-equal? "apply check4" #t (apply equal? '((1 2) (1 2))))
-(assert-equal? "apply check5" "iue" (apply substring '("aiueo" 1 3)))
+(assert-equal? "apply check5" "iu" (apply substring '("aiueo" 1 3)))
(assert-eq? "apply check6" 4 (apply (lambda (x y) (+ x y)) '(1 3)))
(assert-eq? "apply check7" 4 (apply (lambda (x y) (+ x y)) '(1 3)))
More information about the uim-commit
mailing list