Поправљени багови у додељивању променљивих окружењу, у третирању окружења у репно елиминисаном евалуатору, и лоше дефиниције >= и <=

This commit is contained in:
kappa 2019-10-10 17:27:44 +02:00
parent 5b83ea1f7a
commit f8a4b9909a
4 changed files with 35 additions and 24 deletions

38
eval.c
View file

@ -1,4 +1,3 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -6,9 +5,6 @@
#include "internals.h"
#include "eval.h"
int currentRecursionDepth = 0;
int maxRecursionDepth = 10000;
object apply(object function, object parameters, env currentEnv);
int bindArgs(object parameters, object args, env newEnv)
@ -150,12 +146,6 @@ apply:
procedure = copyObject(CAR(input));
parameters = copyObject(CDR(input));
deleteObject(input);
if (tailExpression && PROC_TYPE(procedure) != builtinProc &&
!macroEvalPending)
{
removeEnvironment(currentEnv);
}
if (TYPE(procedure) != procedureObject)
{
@ -219,18 +209,27 @@ apply:
return result;
}
if (++currentRecursionDepth > maxRecursionDepth)
{
--currentRecursionDepth;
deleteObject(procedure);
deleteObject(parameters);
SIGERR(maxRecursionDepthError);
}
object args = PROC_COMP_ARGS(procedure);
env definitionEnv = PROC_COMP_ENV(procedure);
env procEnv;
if (tailExpression && !macroEvalPending)
{
if (definitionEnv == currentEnv)
{
procEnv = currentEnv;
}
else
{
removeEnvironment(currentEnv);
procEnv = createEnvironment(definitionEnv);
}
}
else
{
procEnv = createEnvironment(definitionEnv);
}
env procEnv = createEnvironment(definitionEnv);
if (!bindArgs(parameters, args, procEnv))
{
deleteObject(args);
@ -256,7 +255,6 @@ apply:
deleteObject(procedure);
deleteObject(parameters);
--currentRecursionDepth;
input = currentExpr;
if (macroEvalPending)
{

2
util.c
View file

@ -115,12 +115,12 @@ void addSymbolVariable(char *symbol, object variable, env currentEnv)
else
{
*e = malloc(sizeof(entry));
(*e)->left = (*e)->right = NULL;
}
(*e)->value = copyObject(variable);
(*e)->name = malloc(sizeof(char) * (strlen(symbol) + 1));
strcpy((*e)->name, symbol);
(*e)->left = (*e)->right = NULL;
}
object referVariable(char *symbol, env currentEnv)

View file

@ -122,10 +122,23 @@
остатак (сар аргументи)))))
(опиши (>= . аргументи)
(услов
((< (дужина аргументи) 2) #и)
((= (дужина аргументи) 2)
(или (примени > аргументи) (примени = аргументи)))
(#и (и
(>= (сар аргументи) (садр аргументи))
(примени >= (сддр аргументи))))))
(опиши (<= . аргументи)
(услов
((< (дужина аргументи) 2) #и)
((= (дужина аргументи) 2)
(или (примени < аргументи) (примени = аргументи)))
(#и (и
(<= (сар аргументи) (садр аргументи))
(примени <= (сддр аргументи))))))
(опиши (цео-број? џ)
(= (именилац (нетачно->тачно џ)) 1))