apply сада појединачно копира и брише изразе процедуре, уместо целог тела

This commit is contained in:
kappa 2019-03-23 22:07:31 +01:00
parent ff4e73a624
commit 35cd4b13cf
5 changed files with 11 additions and 12 deletions

View file

@ -172,5 +172,5 @@ int main(int argc, char **argv)
; ;
printf("\nДостигнут крај улазног тока.\nЗбогом и дођите нам опет!\n"); printf("\nДостигнут крај улазног тока.\nЗбогом и дођите нам опет!\n");
return 0; exitCirilisp(0);
} }

View file

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

21
eval.c
View file

@ -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;