Додате сар и сдр и примени функције, поправљен баг у примени сложених функција

This commit is contained in:
kappa 2019-02-11 11:21:30 +01:00
parent 545aefd250
commit 7a57180cea
6 changed files with 65 additions and 15 deletions

View file

@ -57,9 +57,11 @@ void init()
addSymbolInternal("ниска?", &stringQInt, 0);
addSymbolInternal("карактер?", &charQInt, 0);
addSymbolInternal("листа?", &listQInt, 0);
addSymbolInternal("листа", &listInt, 0);
addSymbolInternal("конс", &consInt, 0);
addSymbolInternal("сар", &carInt, 0);
addSymbolInternal("сдр", &cdrInt, 0);
addSymbolInternal("јед?", &eqvQInt, 0);
addSymbolInternal("примени", &applyInt, 0);
if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ"))
{

5
eval.c
View file

@ -129,6 +129,8 @@ int bindArgs(object parameters, object args, env newEnv)
currentArg = &CDR(*currentArg);
currentParam = &CDR(*currentParam);
}
addSymbolVariable(SYM(*currentArg), *currentParam,
newEnv);
return 1;
}
}
@ -146,7 +148,8 @@ object apply(object procedure, object parameters, env currentEnv)
if (PROC_TYPE(procedure) == builtinProc)
{
object(*f)() = PROC_BUILTIN(procedure);
if (f == defineInt || f == lambdaInt || f == ifInt)
if (f == defineInt || f == lambdaInt || f == ifInt ||
f == applyInt)
{
result = f(parameters, currentEnv);
}

1
eval.h
View file

@ -1,3 +1,4 @@
#pragma once
object eval(object input, env currentEnv);
object apply(object function, object parameters, env currentEnv);

View file

@ -497,13 +497,6 @@ object listQInt(object parameters)
return result;
}
object listInt(object parameters)
{
object result;
result = copyObject(parameters);
return result;
}
object consInt(object parameters)
{
if (listLength(parameters) != 2)
@ -518,6 +511,32 @@ object consInt(object parameters)
return result;
}
object cellElement(object parameters, int part)
/* враћа car или cdr (сар или сдр) датог конс објекта у зависности од тога да
* ли је part 0 или нешто друго (1) */
{
if (listLength(parameters) != 1)
{
SIGERR(argumentNumberError);
}
if (TYPE(CAR(parameters)) != consObject)
{
SIGERR(typeError);
}
return !part ? copyObject(CAR(CAR(parameters))) :
copyObject(CDR(CAR(parameters)));
}
object carInt(object parameters)
{
return cellElement(parameters, 0);
}
object cdrInt(object parameters)
{
return cellElement(parameters, 1);
}
object eqvQInt(object parameters)
{
if (listLength(parameters) != 2)
@ -526,7 +545,7 @@ object eqvQInt(object parameters)
}
object result;
TYPE(result) = boolObject;
BOOL(result) = 0;
BOOL(result) = 1;
if (TYPE(CAR(parameters)) != TYPE(CAR(CDR(parameters))))
{
BOOL(result) = 0;
@ -571,6 +590,9 @@ object eqvQInt(object parameters)
BOOL(result) = CHR(CAR(parameters)) ==
CHR(CAR(CDR(parameters)));
break;
case nilObject:
BOOL(result) = 1;
break;
case consObject:
case procedureObject:
default:
@ -580,3 +602,17 @@ object eqvQInt(object parameters)
}
return result;
}
object applyInt(object parameters, env currentEnv)
{
if (listLength(parameters) != 2)
{
SIGERR(argumentNumberError);
}
if (!properList(CAR(CDR(parameters))) ||
TYPE(CAR(parameters)) != procedureObject)
{
SIGERR(typeError);
}
return apply(CAR(parameters), CAR(CDR(parameters)), currentEnv);
}

View file

@ -8,12 +8,12 @@ object divideInt(object parameters);
object exactToInexactInt(object parameters);
object inexactToExactInt(object parameters);
object quoteInt(object parameters);
object lambdaInt(object parameters);
object defineInt(object parameters);
object lambdaInt(object parameters, env currentEnv);
object defineInt(object parameters, env currentEnv);
object lessInt(object parameters);
object greaterInt(object parameters);
object eqNumInt(object parameters);
object ifInt(object parameters);
object ifInt(object parameters, env currentEnv);
object nilQInt(object parameters);
object consQInt(object parameters);
object numberQInt(object parameters);
@ -23,6 +23,8 @@ object boolQInt(object parameters);
object stringQInt(object parameters);
object charQInt(object parameters);
object listQInt(object parameters);
object listInt(object parameters);
object consInt(object parameters);
object carInt(object parameters);
object cdrInt(object parameters);
object eqvQInt(object parameters);
object applyInt(object parameters, env currentEnv);

View file

@ -1,2 +1,8 @@
(дефиниши (не предикат)
(дефиниши (није предикат)
(ако предикат #л #и))
(дефиниши нил ())
(дефиниши истинито #и) (дефиниши лажно #л)
(дефиниши (листа . арг) арг)