From 701bf84d661ef5235c883d1c5fd6f039eab0547a Mon Sep 17 00:00:00 2001 From: Hojun Choi Date: Mon, 2 Sep 2024 19:00:13 +0900 Subject: [PATCH] add If stmt --- bltin.c | 3 +++ dat.h | 1 + eval.c | 21 +++++++++++++++++++++ obj.c | 2 +- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/bltin.c b/bltin.c index 635919c..1c504d2 100644 --- a/bltin.c +++ b/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}, }; diff --git a/dat.h b/dat.h index fcbedf9..cd201f4 100644 --- a/dat.h +++ b/dat.h @@ -92,3 +92,4 @@ extern Object Cons; extern Object Define; extern Object Setq; extern Object Eq; +extern Object If; diff --git a/eval.c b/eval.c index df12e80..ec6bdf3 100644 --- a/eval.c +++ b/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) { diff --git a/obj.c b/obj.c index ffdd5d5..631d42c 100644 --- a/obj.c +++ b/obj.c @@ -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];