return nil if false on cmp
This commit is contained in:
parent
e38c7d5eed
commit
0e6bc88cab
27
eval.c
27
eval.c
@ -228,7 +228,7 @@ fnmod(Object *env, Object *list)
|
|||||||
return newint(gc, sum);
|
return newint(gc, sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
static long
|
||||||
cmp(Object *env, Object *list)
|
cmp(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
Object *a = eval(env, list->car);
|
Object *a = eval(env, list->car);
|
||||||
@ -238,51 +238,56 @@ cmp(Object *env, Object *list)
|
|||||||
return a->num - b->num;
|
return a->num - b->num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Object*
|
||||||
|
_newint(int n)
|
||||||
|
{
|
||||||
|
if(n == 0)
|
||||||
|
return &Nil;
|
||||||
|
return newint(gc, 1);
|
||||||
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fneq(Object *env, Object *list)
|
fneq(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
return newint(gc, cmp(env, list) == 0);
|
return _newint(cmp(env, list) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fnge(Object *env, Object *list)
|
fnge(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
return newint(gc, cmp(env, list) >= 0);
|
return _newint(cmp(env, list) >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fngt(Object *env, Object *list)
|
fngt(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
return newint(gc, cmp(env, list) > 0);
|
return _newint(cmp(env, list) > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fnle(Object *env, Object *list)
|
fnle(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
return newint(gc, cmp(env, list) <= 0);
|
return _newint(cmp(env, list) <= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fnlt(Object *env, Object *list)
|
fnlt(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
return newint(gc, cmp(env, list) < 0);
|
return _newint(cmp(env, list) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fnne(Object *env, Object *list)
|
fnne(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
return newint(gc, cmp(env, list) != 0);
|
return _newint(cmp(env, list) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if test then else */
|
|
||||||
Object*
|
Object*
|
||||||
fnif(Object *env, Object *list)
|
fnif(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
if(list->type != OCELL || list->cdr->type != OCELL)
|
if(list->type != OCELL || list->cdr->type != OCELL)
|
||||||
error("Malformed if stmt");
|
error("Malformed if stmt");
|
||||||
Object *test = list->car;
|
if(eval(env, list->car)!=&Nil)
|
||||||
test = eval(env, test);
|
|
||||||
if(test != &Nil)
|
|
||||||
return eval(env, list->cdr->car);
|
return eval(env, list->cdr->car);
|
||||||
if(list->cdr->cdr == &Nil)
|
if(list->cdr->cdr == &Nil)
|
||||||
return &Nil;
|
return &Nil;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user