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"
|
#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
3
dat.h
@ -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
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*
|
static Object*
|
||||||
evallist(Object *env, Object *list)
|
evallist(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
|
|||||||
4
obj.c
4
obj.c
@ -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];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user