Поправљени багови у додељивању променљивих окружењу, у третирању окружења у репно елиминисаном евалуатору, и лоше дефиниције >= и <=
This commit is contained in:
parent
5b83ea1f7a
commit
f8a4b9909a
2
Makefile
2
Makefile
|
@ -3,7 +3,7 @@
|
|||
# ћирилисп верзија
|
||||
VERSION = 0,9
|
||||
|
||||
ifeq($(OS), Windows_NT)
|
||||
ifeq ($(OS), Windows_NT)
|
||||
include Makefile.win
|
||||
else
|
||||
include Makefile.unix
|
||||
|
|
38
eval.c
38
eval.c
|
@ -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
2
util.c
|
@ -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)
|
||||
|
|
13
инит.ћ
13
инит.ћ
|
@ -122,10 +122,23 @@
|
|||
остатак (сар аргументи)))))
|
||||
|
||||
(опиши (>= . аргументи)
|
||||
(услов
|
||||
((< (дужина аргументи) 2) #и)
|
||||
((= (дужина аргументи) 2)
|
||||
(или (примени > аргументи) (примени = аргументи)))
|
||||
(#и (и
|
||||
(>= (сар аргументи) (садр аргументи))
|
||||
(примени >= (сддр аргументи))))))
|
||||
|
||||
|
||||
(опиши (<= . аргументи)
|
||||
(услов
|
||||
((< (дужина аргументи) 2) #и)
|
||||
((= (дужина аргументи) 2)
|
||||
(или (примени < аргументи) (примени = аргументи)))
|
||||
(#и (и
|
||||
(<= (сар аргументи) (садр аргументи))
|
||||
(примени <= (сддр аргументи))))))
|
||||
|
||||
(опиши (цео-број? џ)
|
||||
(= (именилац (нетачно->тачно џ)) 1))
|
||||
|
|
Loading…
Reference in a new issue