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 Define= (Object){.type=OBLTIN, .sym="define"};
|
||||||
Object Setq = (Object){.type=OBLTIN, .sym="setq"};
|
Object Setq = (Object){.type=OBLTIN, .sym="setq"};
|
||||||
Object Eq = (Object){.type=OBLTIN, .sym="eq"};
|
Object Eq = (Object){.type=OBLTIN, .sym="eq"};
|
||||||
|
Object If = (Object){.type=OBLTIN, .sym="if"};
|
||||||
|
|
||||||
extern Object* fnplus(Object *, Object *);
|
extern Object* fnplus(Object *, Object *);
|
||||||
extern Object* fnlambda(Object *, Object *);
|
extern Object* fnlambda(Object *, Object *);
|
||||||
@ -23,6 +24,7 @@ extern Object* fncar(Object *, Object *);
|
|||||||
extern Object* fncdr(Object *, Object *);
|
extern Object* fncdr(Object *, Object *);
|
||||||
extern Object* fncons(Object *, Object *);
|
extern Object* fncons(Object *, Object *);
|
||||||
extern Object* fneq(Object *, Object *);
|
extern Object* fneq(Object *, Object *);
|
||||||
|
extern Object* fnif(Object *, Object *);
|
||||||
/*extern Object* fnminus(Object *, Object *);*/
|
/*extern Object* fnminus(Object *, Object *);*/
|
||||||
|
|
||||||
Bltinfn
|
Bltinfn
|
||||||
@ -42,6 +44,7 @@ bltinlookup(Object *obj)
|
|||||||
{&Cdr ,fncdr},
|
{&Cdr ,fncdr},
|
||||||
{&Cons ,fncons},
|
{&Cons ,fncons},
|
||||||
{&Eq, fneq},
|
{&Eq, fneq},
|
||||||
|
{&If, fnif},
|
||||||
{&Minus ,0},
|
{&Minus ,0},
|
||||||
{0},
|
{0},
|
||||||
};
|
};
|
||||||
|
|||||||
1
dat.h
1
dat.h
@ -92,3 +92,4 @@ extern Object Cons;
|
|||||||
extern Object Define;
|
extern Object Define;
|
||||||
extern Object Setq;
|
extern Object Setq;
|
||||||
extern Object Eq;
|
extern Object Eq;
|
||||||
|
extern Object If;
|
||||||
|
|||||||
21
eval.c
21
eval.c
@ -14,6 +14,12 @@ exprlen(Object *expr)
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
istrue(Object *o)
|
||||||
|
{
|
||||||
|
return o && o->type==OINT && o->num!=0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
islist(Object *obj)
|
islist(Object *obj)
|
||||||
{
|
{
|
||||||
@ -176,6 +182,21 @@ fneq(Object *env, Object *list)
|
|||||||
return newint(gc, eq(env, a, b));
|
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*
|
static Object*
|
||||||
evallist(Object *env, Object *list)
|
evallist(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
|
|||||||
2
obj.c
2
obj.c
@ -52,7 +52,7 @@ newsymbol(GC *gc, char *str, int len)
|
|||||||
{
|
{
|
||||||
static Object *syms[] = {
|
static Object *syms[] = {
|
||||||
&Nil, &Minus, &Plus, &Lambda, &Car, &Cdr, &Quote, &Cons,
|
&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){
|
for(int i = 0; i < sizeof(syms)/sizeof(syms[0]); ++i){
|
||||||
Object *c = syms[i];
|
Object *c = syms[i];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user