apply сада појединачно копира и брише изразе процедуре, уместо целог тела
This commit is contained in:
parent
ff4e73a624
commit
35cd4b13cf
|
@ -172,5 +172,5 @@ int main(int argc, char **argv)
|
||||||
;
|
;
|
||||||
printf("\nДостигнут крај улазног тока.\nЗбогом и дођите нам опет!\n");
|
printf("\nДостигнут крај улазног тока.\nЗбогом и дођите нам опет!\n");
|
||||||
|
|
||||||
return 0;
|
exitCirilisp(0);
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
21
eval.c
21
eval.c
|
@ -172,31 +172,30 @@ object apply(object procedure, object parameters, env currentEnv)
|
||||||
--currentRecursionDepth;
|
--currentRecursionDepth;
|
||||||
SIGERR(maxRecursionDepthError);
|
SIGERR(maxRecursionDepthError);
|
||||||
}
|
}
|
||||||
object args = copyObject(PROC_COMP_ARGS(procedure));
|
|
||||||
object body = copyObject(PROC_COMP_BODY(procedure));
|
object args = PROC_COMP_ARGS(procedure);
|
||||||
env definitionEnv = PROC_COMP_ENV(procedure);
|
env definitionEnv = PROC_COMP_ENV(procedure);
|
||||||
|
|
||||||
env procEnv = createEnvironment(definitionEnv);
|
env procEnv = createEnvironment(definitionEnv);
|
||||||
if (!bindArgs(parameters, args, procEnv))
|
if (!bindArgs(parameters, args, procEnv))
|
||||||
{
|
{
|
||||||
deleteObject(args);
|
deleteObject(args);
|
||||||
deleteObject(body);
|
|
||||||
removeEnvironment(procEnv);
|
removeEnvironment(procEnv);
|
||||||
SIGERR(argumentNumberError);
|
SIGERR(argumentNumberError);
|
||||||
}
|
}
|
||||||
|
|
||||||
object *currentSubProc = &body;
|
object *currentExprPointer = &PROC_COMP_BODY(procedure);
|
||||||
while (TYPE(*currentSubProc) != nilObject)
|
while (TYPE(*currentExprPointer) != nilObject)
|
||||||
{
|
{
|
||||||
CAR(*currentSubProc) = Eval(CAR(*currentSubProc), procEnv);
|
object currentExpr = copyObject(CAR(*currentExprPointer));
|
||||||
if (TYPE(CDR(*currentSubProc)) == nilObject)
|
currentExpr = Eval(currentExpr, procEnv);
|
||||||
|
if (TYPE(CDR(*currentExprPointer)) == nilObject)
|
||||||
{
|
{
|
||||||
result = copyObject(CAR(*currentSubProc));
|
result = copyObject(currentExpr);
|
||||||
}
|
}
|
||||||
currentSubProc = &CDR(*currentSubProc);
|
currentExprPointer = &CDR(*currentExprPointer);
|
||||||
|
deleteObject(currentExpr);
|
||||||
}
|
}
|
||||||
deleteObject(args);
|
|
||||||
deleteObject(body);
|
|
||||||
removeEnvironment(procEnv);
|
removeEnvironment(procEnv);
|
||||||
--currentRecursionDepth;
|
--currentRecursionDepth;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue