diff --git a/cirilisp.c b/cirilisp.c index a9e0f0a..6d202ee 100644 --- a/cirilisp.c +++ b/cirilisp.c @@ -84,7 +84,7 @@ void init() addSymbolInternal("карактер", &charInt, 0); addSymbolInternal("карактер?", &charQInt, 0); addSymbolInternal("конс?", &consQInt, 0); - addSymbolInternal("ламбда", &lambdaInt, 1); + addSymbolInternal("људи", &lambdaInt, 1); addSymbolInternal("прикажи", &displayInt, 0); addSymbolInternal("нил?", &nilQInt, 0); addSymbolInternal("направи-ниску", &makeStrInt, 0); diff --git a/eval.c b/eval.c index 9e2ab9a..95e4b11 100644 --- a/eval.c +++ b/eval.c @@ -66,9 +66,10 @@ int bindArgs(object parameters, object args, env newEnv) object Eval(object input, env currentEnv) { object result; - int tailExpression = 0; + int tailExpression = 0, macroEvalPending; eval: + macroEvalPending = 0; if (TYPE(input) == symbolObject) { result = referVariable(SYM(input), currentEnv); @@ -126,13 +127,14 @@ eval: } else { - goto apply; if (TYPE(CAR(input)) == procedureObject && PROC_SPECIAL(CAR(input)) && PROC_TYPE(CAR(input)) == compoundProc) { - result = Eval(result, currentEnv); + macroEvalPending = 1; } + goto apply; + // big problem pendejo } } } @@ -153,7 +155,7 @@ apply: procedure = copyObject(CAR(input)); parameters = copyObject(CDR(input)); deleteObject(input); - if (tailExpression && PROC_TYPE(procedure) != builtinProc) + if (tailExpression && PROC_TYPE(procedure) != builtinProc && !macroEvalPending) { removeEnvironment(currentEnv); } @@ -231,7 +233,15 @@ apply: deleteObject(parameters); --currentRecursionDepth; input = currentExpr; - currentEnv = procEnv; - tailExpression = 1; + if (macroEvalPending) + { + input = Eval(input, procEnv); + removeEnvironment(procEnv); + } + else + { + currentEnv = procEnv; + tailExpression = 1; + } goto eval; }