overwrite redefine variable

This commit is contained in:
yoyo 2024-09-08 17:37:31 +09:00
parent 184aab3420
commit 9b37437e53
2 changed files with 17 additions and 11 deletions

25
eval.c
View File

@ -45,12 +45,22 @@ _newfn(Object *env, Object *l, enum OType type)
return newfn(gc, env, params, body, type); return newfn(gc, env, params, body, type);
} }
static void
setvar(Object *env, Object *id, Object *val)
{
Object *obj = find(env, id);
if(obj == 0)
env->vars = newacons(gc, id, val, env->vars);
else
obj->cdr = val;
}
Object* Object*
fndefn(Object *env, Object *list) fndefn(Object *env, Object *list)
{ {
Object *fn = _newfn(env, list->cdr, OFUNC); Object *fn = _newfn(env, list->cdr, OFUNC);
env->vars = newacons(gc, list->car, fn, env->vars); setvar(env, list->car, fn);
return env->vars; return fn;
} }
Object* Object*
@ -63,8 +73,8 @@ 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 = newacons(gc, l->car, macro, env->vars); setvar(env, l->car, macro);
return env->vars; return macro;
} }
static Object* static Object*
@ -101,11 +111,8 @@ 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);
Object *obj = find(env, list->car); setvar(env, list->car, val);
if(obj) return val;
return obj->cdr = val;
env->vars = newacons(gc, list->car, val, env->vars);
return env->vars;
} }
Object* Object*

3
main.c
View File

@ -99,10 +99,9 @@ loop(Object *env, FILE *f)
while(1){ while(1){
printf(">> "); printf(">> ");
Object *res = nextexpr(f); Object *res = nextexpr(f);
printexpr(res);
res = eval(env, res); res = eval(env, res);
printgc("status", gc);
printexpr(res); printexpr(res);
printgc("status", gc);
} }
} }