add If stmt
This commit is contained in:
parent
a42440d403
commit
701bf84d66
3
bltin.c
3
bltin.c
@ -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
1
dat.h
@ -92,3 +92,4 @@ extern Object Cons;
|
||||
extern Object Define;
|
||||
extern Object Setq;
|
||||
extern Object Eq;
|
||||
extern Object If;
|
||||
|
||||
21
eval.c
21
eval.c
@ -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)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user