Clean-up. Added startList(). Fixed `T` and `F`

This commit is contained in:
= 2020-05-08 17:00:14 +01:00
parent 1da347e612
commit 29aa001de8
3 changed files with 39 additions and 28 deletions

View File

@ -389,6 +389,13 @@ inline Object listObject()
return list;
}
inline Object startList(const Object start)
{
Object list = listObject();
nf_addToList(&list, start);
return list;
}
inline Object numberObject(int num)
{
Object o = newObject(TYPE_NUMBER);

View File

@ -96,6 +96,7 @@ void allocObject(Object **spot, const Object src);
Object newObject(Type type);
Object listObject();
Object startList(const Object start);
Object lambdaObject();
Object symbolObject();
Object boolObject(int b);

View File

@ -35,7 +35,7 @@ Object fetchFromEnvironment(const char *name, struct Environment *env)
return errorObject(NULL_ENV);
printd("Fetching '%s' from env\n", name);
printEnv(env);
// printEnv(env);
for(int i = 0; i < env->size; i++) {
if(strcmp(name, env->strings[i]) == 0) {
return env->objects[i];
@ -72,7 +72,7 @@ Result readSeq(struct Slice *tokens)
{
Object res = listObject();
for(;;) {
struct Slice *next = &tokens[0];
struct Slice *next = tokens;
struct Slice *rest = next->text? &next[1] : NULL;
if(next->text[0] == ')') {
return result(res, rest);
@ -93,10 +93,10 @@ Object parseAtom(struct Slice *s)
}
return numberObject(num);
} else if (s->text[0] == 'T' && s->text[1] == '\0') {
} else if (s->text[0] == 'T' && s->length == 1) {
return boolObject(1);
} else if (s->text[0] == 'F' && s->text[1] == '\0') {
} else if (s->text[0] == 'F' && s->length == 1) {
return boolObject(0);
} else {
@ -108,7 +108,7 @@ Object parseAtom(struct Slice *s)
Object evalDefArgs(const Object *arg_forms, struct Environment *env)
{
const Object *first_form = &arg_forms[0];
const Object *first_form = arg_forms;
const char *name = first_form->name;
// Immediately adding the function to the env might allow recursion?
@ -121,6 +121,15 @@ Object evalDefArgs(const Object *arg_forms, struct Environment *env)
Object evalIfArgs(const Object *arg_forms, struct Environment *env)
{
printf("eval(arg_forms):\n ");
Object o = eval(arg_forms, env);
printObj(&o);
printf("eval(arg_forms->forward):\n ");
o = eval(arg_forms->forward, env);
printObj(&o);
printf("eval(arg_forms->forward->forward):\n ");
o = eval(arg_forms->forward->forward, env);
printObj(&o);
return eval(arg_forms, env).number?
eval(arg_forms->forward, env) :
eval(arg_forms->forward->forward, env);
@ -137,8 +146,8 @@ Object evalMapArgs(const Object *arg_forms, struct Environment *env)
if(!arg_forms)
return errorObject(NULL_MAP_ARGS);
const Object lambda = eval(&arg_forms[0], env);
Object *oldList = (&arg_forms[0])->forward;
const Object lambda = eval(arg_forms, env);
Object *oldList = arg_forms->forward;
if(lambda.type != TYPE_LAMBDA || oldList->type != TYPE_LIST)
return errorObject(BAD_TYPE);
@ -149,10 +158,7 @@ Object evalMapArgs(const Object *arg_forms, struct Environment *env)
while(oldElement != NULL) {
// Create a new list for each element in the list,
// since lambda evaluation looks for a list
Object tempList = listObject();
Object listBack[1] = {*oldElement};
listBack[0].forward = NULL;
tempList.list = listBack;
const Object tempList = startList(*oldElement);
struct Environment newEnv =
envForLambda(&lambda.lambda->params, &tempList, env);
@ -173,11 +179,12 @@ struct Environment envForLambda(const Object *params, const Object *arg_forms,
int length = listLength(params);
struct Environment env;
env.outer = outer;
env.strings = NULL;
env.objects = NULL;
env.size = length;
struct Environment env = {
.outer = outer,
.strings = NULL,
.objects = NULL,
.size = length
};
if(length == 0)
return env;
@ -185,15 +192,12 @@ struct Environment envForLambda(const Object *params, const Object *arg_forms,
env.strings = calloc(sizeof(char*), length + 1);
env.objects = malloc(sizeof(Object) * length + 1);
Object vs[length];
eval_forms(vs, arg_forms, outer);
const Object *o = arg_forms;
for(int i = 0; i < length; i++) {
const char *n = itemAt(params, i)->name;
addToEnv(&env, n, eval(&arg_forms[i], outer)); // May not need eval?
// SHOULD BE `vs` not arg_forms???
} // Something is segfaulting, anyway
// env.strings[length] = NULL;
addToEnv(&env, n, eval(o, outer)); // Could use eval_forms?
o = o->forward;
}
return env;
}
@ -271,6 +275,7 @@ Object eval(const Object *obj, struct Environment *env)
struct Environment newEnv =
envForLambda(&first_eval.lambda->params, first_form->forward, env);
Object ret = eval(&first_eval.lambda->body, &newEnv);
printEnv(&newEnv);
deleteEnv(&newEnv);
return ret;
@ -338,8 +343,8 @@ void printEnv(struct Environment *env)
for(int i = 0; i < env->size; i++) {
if(env->strings[i] == NULL)
return;
printd("env[%d]: '%s'\n ", i, env->strings[i]);
debugObj(&env->objects[i]);
printf("env[%d]: '%s'\n ", i, env->strings[i]);
printObj(&env->objects[i]);
}
}
@ -384,9 +389,7 @@ bopf(lth, '<');
void addFunc(const char *name, Object (*func)(Object, Object),
struct Environment *env)
{
Object o;
o.type = TYPE_FUNC;
o.forward = NULL;
Object o = newObject(TYPE_FUNC);
o.func = func;
addToEnv(env, name, o);
}