From f8a4b9909a3a7058e0f56934d12d7608a4c5d352 Mon Sep 17 00:00:00 2001 From: kappa Date: Thu, 10 Oct 2019 17:27:44 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D1=99?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=20=D0=B1=D0=B0=D0=B3=D0=BE=D0=B2=D0=B8=20?= =?UTF-8?q?=D1=83=20=D0=B4=D0=BE=D0=B4=D0=B5=D1=99=D0=B8=D0=B2=D0=B0=D1=9A?= =?UTF-8?q?=D1=83=20=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=BD=D1=99=D0=B8=D0=B2?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D1=9A=D1=83?= =?UTF-8?q?,=20=D1=83=20=D1=82=D1=80=D0=B5=D1=82=D0=B8=D1=80=D0=B0=D1=9A?= =?UTF-8?q?=D1=83=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D1=9A=D0=B0=20?= =?UTF-8?q?=D1=83=20=D1=80=D0=B5=D0=BF=D0=BD=D0=BE=20=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=BD=D0=B8=D1=81=D0=B0=D0=BD=D0=BE=D0=BC=20=D0=B5?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D1=83=D0=B0=D1=82=D0=BE=D1=80=D1=83,=20?= =?UTF-8?q?=D0=B8=20=D0=BB=D0=BE=D1=88=D0=B5=20=D0=B4=D0=B5=D1=84=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D0=B8=D1=98=D0=B5=20>=3D=20=D0=B8=20<=3D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- eval.c | 38 ++++++++++++++++++-------------------- util.c | 2 +- инит.ћ | 17 +++++++++++++++-- 4 files changed, 35 insertions(+), 24 deletions(-) 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))