define function can't change already exist variable
This commit is contained in:
parent
df44ec05ce
commit
b1f355b248
17
eval.c
17
eval.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user