return nil if false on cmp

This commit is contained in:
yoyo 2024-09-08 16:10:49 +09:00
parent e38c7d5eed
commit 0e6bc88cab

27
eval.c
View File

@ -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;