From b1f355b248eefb71ff09533d837d185802a08e48 Mon Sep 17 00:00:00 2001 From: yoyo Date: Mon, 9 Sep 2024 16:04:55 +0900 Subject: [PATCH] define function can't change already exist variable --- eval.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/eval.c b/eval.c index 07dc211..8de8a13 100644 --- a/eval.c +++ b/eval.c @@ -46,16 +46,13 @@ _newfn(Object *env, Object *l, enum OType type) } static Object* -setvar(Object *env, Object *id, Object *val) +defvar(Object *env, Object *id, Object *val) { - printexpr(id); - Object *obj = find(env, id); - if(obj == 0) - return newacons(gc, id, val, env->vars); - else{ - obj->cdr = val; - return env->vars; + for(Object *p=env->vars; p!=&Nil; p=p->cdr){ + if(strequal(id, p->car->car)) + error("already exist variable. use setq plz..."); } + return newacons(gc, id, val, env->vars); } Object* @@ -68,7 +65,7 @@ Object* fnmacro(Object *env, Object *l) { Object *macro = _newfn(env, l->cdr, OMACRO); - env->vars = setvar(env, l->car, macro); + env->vars = defvar(env, l->car, macro); return macro; } @@ -106,7 +103,7 @@ fndefine(Object *env, Object *list) if(exprlen(list)!=2 || list->car->type!=OIDENT) error("Malformed define"); Object *val = eval(env, list->cdr->car); - env->vars = setvar(env, list->car, val); + env->vars = defvar(env, list->car, val); return val; }