overwrite redefine variable
This commit is contained in:
parent
184aab3420
commit
9b37437e53
25
eval.c
25
eval.c
@ -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
3
main.c
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user