add If stmt

This commit is contained in:
Hojun Choi 2024-09-02 19:00:13 +09:00
parent a42440d403
commit 701bf84d66
4 changed files with 26 additions and 1 deletions

View File

@ -12,6 +12,7 @@ Object Cons = (Object){.type=OBLTIN, .sym="cons"};
Object Define= (Object){.type=OBLTIN, .sym="define"};
Object Setq = (Object){.type=OBLTIN, .sym="setq"};
Object Eq = (Object){.type=OBLTIN, .sym="eq"};
Object If = (Object){.type=OBLTIN, .sym="if"};
extern Object* fnplus(Object *, Object *);
extern Object* fnlambda(Object *, Object *);
@ -23,6 +24,7 @@ extern Object* fncar(Object *, Object *);
extern Object* fncdr(Object *, Object *);
extern Object* fncons(Object *, Object *);
extern Object* fneq(Object *, Object *);
extern Object* fnif(Object *, Object *);
/*extern Object* fnminus(Object *, Object *);*/
Bltinfn
@ -42,6 +44,7 @@ bltinlookup(Object *obj)
{&Cdr ,fncdr},
{&Cons ,fncons},
{&Eq, fneq},
{&If, fnif},
{&Minus ,0},
{0},
};

1
dat.h
View File

@ -92,3 +92,4 @@ extern Object Cons;
extern Object Define;
extern Object Setq;
extern Object Eq;
extern Object If;

21
eval.c
View File

@ -14,6 +14,12 @@ exprlen(Object *expr)
return l;
}
int
istrue(Object *o)
{
return o && o->type==OINT && o->num!=0;
}
static int
islist(Object *obj)
{
@ -176,6 +182,21 @@ fneq(Object *env, Object *list)
return newint(gc, eq(env, a, b));
}
/*
* (if ((cond) val)* )
* (if ((eq x y) 0) ((eq x z ) 1) (default))
*/
Object*
fnif(Object *env, Object *list)
{
if(list == 0 || list == &Nil)
return newint(gc, 0);
Object *t = eval(env, list->car->car);
if(istrue(t))
return eval(env, list->car->cdr->car);
return fnif(env, list->cdr);
}
static Object*
evallist(Object *env, Object *list)
{

2
obj.c
View File

@ -52,7 +52,7 @@ newsymbol(GC *gc, char *str, int len)
{
static Object *syms[] = {
&Nil, &Minus, &Plus, &Lambda, &Car, &Cdr, &Quote, &Cons,
&Define, &Setq, &Eq,
&Define, &Setq, &Eq, &If,
};
for(int i = 0; i < sizeof(syms)/sizeof(syms[0]); ++i){
Object *c = syms[i];