define function can't change already exist variable

This commit is contained in:
yoyo 2024-09-09 16:04:55 +09:00
parent df44ec05ce
commit b1f355b248

17
eval.c
View File

@ -46,16 +46,13 @@ _newfn(Object *env, Object *l, enum OType type)
} }
static Object* static Object*
setvar(Object *env, Object *id, Object *val) defvar(Object *env, Object *id, Object *val)
{ {
printexpr(id); for(Object *p=env->vars; p!=&Nil; p=p->cdr){
Object *obj = find(env, id); if(strequal(id, p->car->car))
if(obj == 0) error("already exist variable. use setq plz...");
return newacons(gc, id, val, env->vars);
else{
obj->cdr = val;
return env->vars;
} }
return newacons(gc, id, val, env->vars);
} }
Object* Object*
@ -68,7 +65,7 @@ Object*
fnmacro(Object *env, Object *l) fnmacro(Object *env, Object *l)
{ {
Object *macro = _newfn(env, l->cdr, OMACRO); Object *macro = _newfn(env, l->cdr, OMACRO);
env->vars = setvar(env, l->car, macro); env->vars = defvar(env, l->car, macro);
return macro; return macro;
} }
@ -106,7 +103,7 @@ fndefine(Object *env, Object *list)
if(exprlen(list)!=2 || list->car->type!=OIDENT) if(exprlen(list)!=2 || list->car->type!=OIDENT)
error("Malformed define"); error("Malformed define");
Object *val = eval(env, list->cdr->car); Object *val = eval(env, list->cdr->car);
env->vars = setvar(env, list->car, val); env->vars = defvar(env, list->car, val);
return val; return val;
} }