From 6f34133b0661849bccf891ea0aa4d04f45ca9a9a Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 17 Oct 2021 16:14:59 +0200 Subject: Reduce indentation level in eval function --- src/bootstrap/primitives.c | 103 +++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index ab147d4..0c2a17d 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c @@ -3,7 +3,8 @@ static Object *proc_if; Object * eval(Environment *env, Object *root) { - Object* lambda; + Object* lambda = NULL; + Object* args = NULL; Object* ret = NULL; bool recursion_active = false; eval_start: @@ -85,65 +86,65 @@ eval_start: if (lambda == obj_err) { return obj_err; } - if (lambda->type == OBJ_TYPE_LAMBDA) { - Object *args; + if (lambda->type != OBJ_TYPE_LAMBDA) { + error_push((Error){ + .type = ERR_TYPE_RUNTIME, + .value = ERR_OBJ_NOT_CALLABLE, + }); + return obj_err; + } + eval_lambda: - args = root->cdr; - Object *params = lambda->params; - if (!recursion_active) { - recursion_active = true; - // Protect current stack. - Environment *tmp = env_create(lambda->env); - push_active_env(tmp); - // Extend environment. - env = env_extend(tmp, env); + args = root->cdr; + Object *params = lambda->params; + if (!recursion_active) { + recursion_active = true; + // Protect current stack. + Environment *tmp = env_create(lambda->env); + push_active_env(tmp); + // Extend environment. + env = env_extend(tmp, env); + } + while (params != obj_nil) { + if (args == obj_nil) { + error_push((Error){ + .type = ERR_TYPE_RUNTIME, + .value = ERR_NOT_ENOUGH_ARGS, + }); + return obj_err; } - while (params != obj_nil) { - if (args == obj_nil) { - error_push((Error){ - .type = ERR_TYPE_RUNTIME, - .value = ERR_NOT_ENOUGH_ARGS, - }); - return obj_err; - } - Object *symbol = params->car; - Object *value = eval(env, args->car); - if (value == obj_err) { - return obj_err; - } - if (value == obj_nil) { - error_push((Error){ - .type = ERR_TYPE_RUNTIME, - .value = ERR_NOT_ENOUGH_ARGS, - }); - return obj_err; - } - env_add_or_update_current(env, symbol, value); - args = args->cdr; - params = params->cdr; + Object *symbol = params->car; + Object *value = eval(env, args->car); + if (value == obj_err) { + return obj_err; } - if (args != obj_nil) { + if (value == obj_nil) { error_push((Error){ .type = ERR_TYPE_RUNTIME, - .value = ERR_TOO_MANY_ARGS, + .value = ERR_NOT_ENOUGH_ARGS, }); return obj_err; } - root = lambda->body; - while (root->cdr != obj_nil) { - if (eval(env, root->car) == obj_err) { - return obj_err; - }; - root = root->cdr; - } - root = root->car; - goto eval_start; + env_add_or_update_current(env, symbol, value); + args = args->cdr; + params = params->cdr; } - error_push((Error){ - .type = ERR_TYPE_RUNTIME, - .value = ERR_OBJ_NOT_CALLABLE, - }); - return obj_err; + if (args != obj_nil) { + error_push((Error){ + .type = ERR_TYPE_RUNTIME, + .value = ERR_TOO_MANY_ARGS, + }); + return obj_err; + } + root = lambda->body; + while (root->cdr != obj_nil) { + if (eval(env, root->car) == obj_err) { + return obj_err; + }; + root = root->cdr; + } + root = root->car; + goto eval_start; } break; } -- cgit v1.2.1