Added more error-catching

This commit is contained in:
= 2020-05-08 07:29:06 +01:00
parent 944d9287dc
commit 1da347e612
4 changed files with 19 additions and 9 deletions

View File

@ -6,3 +6,6 @@ debug:
phrase:
gcc -g -O0 -o pebblisp -D STANDALONE -D DEBUG -D NO_REPL pebblisp.c tokens.c object.c
run:
./pebblisp

View File

@ -6,6 +6,7 @@
#define MAX_ENV_ELM 15 // 50
enum errorCode {
MISMATCHED_PARENS,
BAD_LIST_OF_SYMBOL_STRINGS,
TYPE_LIST_NOT_CAUGHT,
NULL_ENV,
@ -21,6 +22,7 @@ enum errorCode {
//#ifdef STANDALONE
static const char *errorText[] = {
"MISMATCHED_PARENS",
"BAD_LIST_OF_SYMBOL_STRINGS",
"TYPE_LIST_NOT_CAUGHT",
"NULL_ENV",

View File

@ -22,6 +22,8 @@ void debugSlice(struct Slice *s)
printd("Debug Slice\n text:'");
for(int i = 0; i < s->length; i++) {
printd("%c", s->text[i]);
if(s->text[i] == '\0')
printd("NULLCHAR\n");
}
printd("'\n");
printd(" length: %d\n", s->length);
@ -61,7 +63,7 @@ Result parse(struct Slice *slices)
if(token->text[0] == '(') {
// todo check for null rest
return readSeq(rest);
} else { // todo error on closed paren
} else { // todo error on missing close paren
return result(parseAtom(token), rest);
}
}
@ -109,6 +111,7 @@ Object evalDefArgs(const Object *arg_forms, struct Environment *env)
const Object *first_form = &arg_forms[0];
const char *name = first_form->name;
// Immediately adding the function to the env might allow recursion?
Object second_eval = eval(first_form->forward, env);
addToEnv(env, name, second_eval);
@ -125,8 +128,8 @@ Object evalIfArgs(const Object *arg_forms, struct Environment *env)
Object evalLambdaArgs(const Object *arg_forms)
{
// params // body
return constructLambda(arg_forms, arg_forms->forward);
// params // body
return constructLambda(arg_forms, arg_forms? arg_forms->forward : NULL);
}
Object evalMapArgs(const Object *arg_forms, struct Environment *env)
@ -137,14 +140,12 @@ Object evalMapArgs(const Object *arg_forms, struct Environment *env)
const Object lambda = eval(&arg_forms[0], env);
Object *oldList = (&arg_forms[0])->forward;
if(lambda.type != TYPE_LAMBDA || oldList->type != TYPE_LIST) {
if(lambda.type != TYPE_LAMBDA || oldList->type != TYPE_LIST)
return errorObject(BAD_TYPE);
}
Object list = listObject();
int i = 0;
Object *oldElement = oldList->list;
const Object *oldElement = oldList->list;
while(oldElement != NULL) {
// Create a new list for each element in the list,
// since lambda evaluation looks for a list
@ -152,7 +153,6 @@ Object evalMapArgs(const Object *arg_forms, struct Environment *env)
Object listBack[1] = {*oldElement};
listBack[0].forward = NULL;
tempList.list = listBack;
printObj(&tempList);
struct Environment newEnv =
envForLambda(&lambda.lambda->params, &tempList, env);
@ -192,7 +192,6 @@ struct Environment envForLambda(const Object *params, const Object *arg_forms,
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;
@ -432,6 +431,8 @@ struct Environment defaultEnv() {
Object parseEval(const char *input, struct Environment *env)
{
struct Slice *tokens = nf_tokenize(input);
if(!tokens)
return errorObject(MISMATCHED_PARENS);
#ifdef DEBUG
struct Slice *debug = tokens;
if(debug) {

View File

@ -63,6 +63,10 @@ struct Slice *nf_tokenize(const char *input)
parens++;
} else if (input[i] == ')') {
parens--;
if(parens < 0) {
free(slices);
return NULL;
}
}
if(isSingle(input[i])) {