diff --git a/Makefile b/Makefile index 27b94ea..c4da849 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # ћирилисп верзија VERSION = 0,9 -ifeq($(OS), Windows_NT) +ifeq ($(OS), Windows_NT) include Makefile.win else include Makefile.unix diff --git a/eval.c b/eval.c index 9292dba..ffbf4fd 100644 --- a/eval.c +++ b/eval.c @@ -1,4 +1,3 @@ -#include #include #include @@ -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) { diff --git a/util.c b/util.c index ac3a3f4..11f31a7 100644 --- a/util.c +++ b/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) diff --git a/инит.ћ b/инит.ћ index 7f1efc4..4dafeb6 100644 --- a/инит.ћ +++ b/инит.ћ @@ -122,10 +122,23 @@ остатак (сар аргументи))))) (опиши (>= . аргументи) - (или (примени > аргументи) (примени = аргументи))) + (услов + ((< (дужина аргументи) 2) #и) + ((= (дужина аргументи) 2) + (или (примени > аргументи) (примени = аргументи))) + (#и (и + (>= (сар аргументи) (садр аргументи)) + (примени >= (сддр аргументи)))))) + (опиши (<= . аргументи) - (или (примени < аргументи) (примени = аргументи))) + (услов + ((< (дужина аргументи) 2) #и) + ((= (дужина аргументи) 2) + (или (примени < аргументи) (примени = аргументи))) + (#и (и + (<= (сар аргументи) (садр аргументи)) + (примени <= (сддр аргументи)))))) (опиши (цео-број? џ) (= (именилац (нетачно->тачно џ)) 1))