From 9b37437e5314a0acf3c2f0984fff70ff8e2cdc91 Mon Sep 17 00:00:00 2001 From: yoyo Date: Sun, 8 Sep 2024 17:37:31 +0900 Subject: [PATCH] overwrite redefine variable --- eval.c | 25 ++++++++++++++++--------- main.c | 3 +-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/eval.c b/eval.c index 46040f6..321ff38 100644 --- a/eval.c +++ b/eval.c @@ -45,12 +45,22 @@ _newfn(Object *env, Object *l, enum OType 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* fndefn(Object *env, Object *list) { Object *fn = _newfn(env, list->cdr, OFUNC); - env->vars = newacons(gc, list->car, fn, env->vars); - return env->vars; + setvar(env, list->car, fn); + return fn; } Object* @@ -63,8 +73,8 @@ Object* fnmacro(Object *env, Object *l) { Object *macro = _newfn(env, l->cdr, OMACRO); - env->vars = newacons(gc, l->car, macro, env->vars); - return env->vars; + setvar(env, l->car, macro); + return macro; } static Object* @@ -101,11 +111,8 @@ fndefine(Object *env, Object *list) if(exprlen(list)!=2 || list->car->type!=OIDENT) error("Malformed define"); Object *val = eval(env, list->cdr->car); - Object *obj = find(env, list->car); - if(obj) - return obj->cdr = val; - env->vars = newacons(gc, list->car, val, env->vars); - return env->vars; + setvar(env, list->car, val); + return val; } Object* diff --git a/main.c b/main.c index bee3b08..e9dc0c2 100644 --- a/main.c +++ b/main.c @@ -99,10 +99,9 @@ loop(Object *env, FILE *f) while(1){ printf(">> "); Object *res = nextexpr(f); - printexpr(res); res = eval(env, res); - printgc("status", gc); printexpr(res); + printgc("status", gc); } }