diff --git a/bltin.c b/bltin.c index 9fc3542..635919c 100644 --- a/bltin.c +++ b/bltin.c @@ -2,8 +2,6 @@ #include "fn.h" Object Nil = (Object){.type=OSYMBOL, .sym="nil"}; -Object True = (Object){.type=OSYMBOL, .sym="true"}; -Object False= (Object){.type=OSYMBOL, .sym="false"}; Object Minus= (Object){.type=OBLTIN, .sym="-"}; Object Plus = (Object){.type=OBLTIN, .sym="+"}; Object Lambda= (Object){.type=OBLTIN, .sym="lambda"}; @@ -13,6 +11,7 @@ Object Quote= (Object){.type=OBLTIN, .sym="'"}; 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"}; extern Object* fnplus(Object *, Object *); extern Object* fnlambda(Object *, Object *); @@ -23,6 +22,7 @@ extern Object* fnquote(Object *, Object *); extern Object* fncar(Object *, Object *); extern Object* fncdr(Object *, Object *); extern Object* fncons(Object *, Object *); +extern Object* fneq(Object *, Object *); /*extern Object* fnminus(Object *, Object *);*/ Bltinfn @@ -41,6 +41,7 @@ bltinlookup(Object *obj) {&Car ,fncar}, {&Cdr ,fncdr}, {&Cons ,fncons}, + {&Eq, fneq}, {&Minus ,0}, {0}, }; diff --git a/dat.h b/dat.h index 9deb8cf..fcbedf9 100644 --- a/dat.h +++ b/dat.h @@ -82,8 +82,6 @@ typedef struct extern GC *gc; extern Object Nil; -extern Object True; -extern Object False; extern Object Minus; extern Object Plus; extern Object Lambda; @@ -93,3 +91,4 @@ extern Object Quote; extern Object Cons; extern Object Define; extern Object Setq; +extern Object Eq; diff --git a/eval.c b/eval.c index b6ee19b..df12e80 100644 --- a/eval.c +++ b/eval.c @@ -154,6 +154,28 @@ fnplus(Object *env, Object *list) } } +long +eq(Object *env, Object *a, Object *b) +{ + if(a == b) + return 1; + if(a->type != b->type) + return 0; + switch(a->type){ + default: error("eq only compare [INT]"); + case OSTRING: return strequal(a, b); + case OINT: return a->num == b->num; + } +} + +Object* +fneq(Object *env, Object *list) +{ + Object *a = eval(env, list->car); + Object *b = eval(env, list->cdr->car); + return newint(gc, eq(env, a, b)); +} + static Object* evallist(Object *env, Object *list) { diff --git a/obj.c b/obj.c index d13a061..ffdd5d5 100644 --- a/obj.c +++ b/obj.c @@ -51,8 +51,8 @@ Object* newsymbol(GC *gc, char *str, int len) { static Object *syms[] = { - &Nil, &True, &False, &Minus, &Plus, - &Lambda, &Car, &Cdr, &Quote, &Cons, &Define, &Setq, + &Nil, &Minus, &Plus, &Lambda, &Car, &Cdr, &Quote, &Cons, + &Define, &Setq, &Eq, }; for(int i = 0; i < sizeof(syms)/sizeof(syms[0]); ++i){ Object *c = syms[i];