add eqaul function

This commit is contained in:
Hojun Choi 2024-09-02 18:15:50 +09:00
parent ded2940768
commit a42440d403
4 changed files with 28 additions and 6 deletions

View File

@ -2,8 +2,6 @@
#include "fn.h" #include "fn.h"
Object Nil = (Object){.type=OSYMBOL, .sym="nil"}; 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 Minus= (Object){.type=OBLTIN, .sym="-"};
Object Plus = (Object){.type=OBLTIN, .sym="+"}; Object Plus = (Object){.type=OBLTIN, .sym="+"};
Object Lambda= (Object){.type=OBLTIN, .sym="lambda"}; 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 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"};
extern Object* fnplus(Object *, Object *); extern Object* fnplus(Object *, Object *);
extern Object* fnlambda(Object *, Object *); extern Object* fnlambda(Object *, Object *);
@ -23,6 +22,7 @@ extern Object* fnquote(Object *, Object *);
extern Object* fncar(Object *, Object *); 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* fnminus(Object *, Object *);*/ /*extern Object* fnminus(Object *, Object *);*/
Bltinfn Bltinfn
@ -41,6 +41,7 @@ bltinlookup(Object *obj)
{&Car ,fncar}, {&Car ,fncar},
{&Cdr ,fncdr}, {&Cdr ,fncdr},
{&Cons ,fncons}, {&Cons ,fncons},
{&Eq, fneq},
{&Minus ,0}, {&Minus ,0},
{0}, {0},
}; };

3
dat.h
View File

@ -82,8 +82,6 @@ typedef struct
extern GC *gc; extern GC *gc;
extern Object Nil; extern Object Nil;
extern Object True;
extern Object False;
extern Object Minus; extern Object Minus;
extern Object Plus; extern Object Plus;
extern Object Lambda; extern Object Lambda;
@ -93,3 +91,4 @@ extern Object Quote;
extern Object Cons; extern Object Cons;
extern Object Define; extern Object Define;
extern Object Setq; extern Object Setq;
extern Object Eq;

22
eval.c
View File

@ -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* static Object*
evallist(Object *env, Object *list) evallist(Object *env, Object *list)
{ {

4
obj.c
View File

@ -51,8 +51,8 @@ Object*
newsymbol(GC *gc, char *str, int len) newsymbol(GC *gc, char *str, int len)
{ {
static Object *syms[] = { static Object *syms[] = {
&Nil, &True, &False, &Minus, &Plus, &Nil, &Minus, &Plus, &Lambda, &Car, &Cdr, &Quote, &Cons,
&Lambda, &Car, &Cdr, &Quote, &Cons, &Define, &Setq, &Define, &Setq, &Eq,
}; };
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];