add eqaul function
This commit is contained in:
parent
ded2940768
commit
a42440d403
5
bltin.c
5
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},
|
||||
};
|
||||
|
||||
3
dat.h
3
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;
|
||||
|
||||
22
eval.c
22
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)
|
||||
{
|
||||
|
||||
4
obj.c
4
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];
|
||||
|
||||
Loading…
Reference in New Issue
Block a user