add <, >, ==, != bltin
This commit is contained in:
parent
bb623c9c20
commit
275c03f518
@ -1,3 +1,3 @@
|
|||||||
* (define fac (lambda (n) (if ((eq n 0) 1) (1 (* n (fac (+ n -1)))))))
|
* (define fac (lambda (n) (if ((== n 0) 1) (1 (* n (fac (+ n -1)))))))
|
||||||
* (if ((eq 0 1) 0) ((eq 1 1) 1))
|
* (if ((== 0 1) 0) ((== 1 1) 1))
|
||||||
* (if ((eq 0 1) 0) ((eq 0 2) 0) (1 (+ 1 2 3 4)))
|
* (if ((== 0 1) 0) ((== 0 2) 0) (1 (+ 1 2 3 4)))
|
||||||
|
|||||||
19
bltin.c
19
bltin.c
@ -7,6 +7,14 @@ Object Plus = (Object){.type=OBLTIN, .sym="+"};
|
|||||||
Object Mul = (Object){.type=OBLTIN, .sym="*"};
|
Object Mul = (Object){.type=OBLTIN, .sym="*"};
|
||||||
Object Div = (Object){.type=OBLTIN, .sym="/"};
|
Object Div = (Object){.type=OBLTIN, .sym="/"};
|
||||||
Object Mod = (Object){.type=OBLTIN, .sym="%"};
|
Object Mod = (Object){.type=OBLTIN, .sym="%"};
|
||||||
|
|
||||||
|
Object Ge = (Object){.type=OBLTIN, .sym= ">="};
|
||||||
|
Object Le = (Object){.type=OBLTIN, .sym= "<="};
|
||||||
|
Object Lt = (Object){.type=OBLTIN, .sym= "<"};
|
||||||
|
Object Gt = (Object){.type=OBLTIN, .sym= ">"};
|
||||||
|
Object Ne = (Object){.type=OBLTIN, .sym= "!="};
|
||||||
|
Object Eq = (Object){.type=OBLTIN, .sym= "=="};
|
||||||
|
|
||||||
Object Lambda= (Object){.type=OBLTIN, .sym="lambda"};
|
Object Lambda= (Object){.type=OBLTIN, .sym="lambda"};
|
||||||
Object Car = (Object){.type=OBLTIN, .sym="car"};
|
Object Car = (Object){.type=OBLTIN, .sym="car"};
|
||||||
Object Cdr = (Object){.type=OBLTIN, .sym="cdr"};
|
Object Cdr = (Object){.type=OBLTIN, .sym="cdr"};
|
||||||
@ -14,7 +22,6 @@ 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"};
|
|
||||||
Object If = (Object){.type=OBLTIN, .sym="if"};
|
Object If = (Object){.type=OBLTIN, .sym="if"};
|
||||||
|
|
||||||
extern Object* fnplus(Object *, Object *);
|
extern Object* fnplus(Object *, Object *);
|
||||||
@ -31,6 +38,11 @@ extern Object* fncdr(Object *, Object *);
|
|||||||
extern Object* fncons(Object *, Object *);
|
extern Object* fncons(Object *, Object *);
|
||||||
extern Object* fneq(Object *, Object *);
|
extern Object* fneq(Object *, Object *);
|
||||||
extern Object* fnif(Object *, Object *);
|
extern Object* fnif(Object *, Object *);
|
||||||
|
extern Object* fnge(Object *env, Object *list);
|
||||||
|
extern Object* fngt(Object *env, Object *list);
|
||||||
|
extern Object* fnle(Object *env, Object *list);
|
||||||
|
extern Object* fnlt(Object *env, Object *list);
|
||||||
|
extern Object* fnne(Object *env, Object *list);
|
||||||
/*extern Object* fnminus(Object *, Object *);*/
|
/*extern Object* fnminus(Object *, Object *);*/
|
||||||
|
|
||||||
Bltinfn
|
Bltinfn
|
||||||
@ -53,7 +65,12 @@ bltinlookup(Object *obj)
|
|||||||
{&Cdr ,fncdr},
|
{&Cdr ,fncdr},
|
||||||
{&Cons ,fncons},
|
{&Cons ,fncons},
|
||||||
{&Eq, fneq},
|
{&Eq, fneq},
|
||||||
|
{&Ne, fnne},
|
||||||
{&If, fnif},
|
{&If, fnif},
|
||||||
|
{&Ge, fnge},
|
||||||
|
{&Le, fnle},
|
||||||
|
{&Gt, fngt},
|
||||||
|
{&Lt, fnlt},
|
||||||
{&Minus ,0},
|
{&Minus ,0},
|
||||||
{0},
|
{0},
|
||||||
};
|
};
|
||||||
|
|||||||
7
dat.h
7
dat.h
@ -68,10 +68,10 @@ typedef struct
|
|||||||
/* objects */
|
/* objects */
|
||||||
struct{
|
struct{
|
||||||
Object *objs;
|
Object *objs;
|
||||||
|
Object *freed;
|
||||||
u64 ob;
|
u64 ob;
|
||||||
u64 oe;
|
u64 oe;
|
||||||
u64 op;
|
u64 op;
|
||||||
Object *freed;
|
|
||||||
};
|
};
|
||||||
/* string */
|
/* string */
|
||||||
struct{
|
struct{
|
||||||
@ -95,4 +95,9 @@ extern Object Cons;
|
|||||||
extern Object Define;
|
extern Object Define;
|
||||||
extern Object Setq;
|
extern Object Setq;
|
||||||
extern Object Eq;
|
extern Object Eq;
|
||||||
|
extern Object Ne;
|
||||||
extern Object If;
|
extern Object If;
|
||||||
|
extern Object Ge;
|
||||||
|
extern Object Le;
|
||||||
|
extern Object Lt;
|
||||||
|
extern Object Gt;
|
||||||
|
|||||||
58
eval.c
58
eval.c
@ -163,7 +163,7 @@ fnplus(Object *env, Object *list)
|
|||||||
Object*
|
Object*
|
||||||
fnmul(Object *env, Object *list)
|
fnmul(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
Object *p=evallist(env, list);
|
Object *p = evallist(env, list);
|
||||||
if(p->car->type != OINT)
|
if(p->car->type != OINT)
|
||||||
error("* take only [INT]");
|
error("* take only [INT]");
|
||||||
long sum = p->car->num;
|
long sum = p->car->num;
|
||||||
@ -210,36 +210,56 @@ fnmod(Object *env, Object *list)
|
|||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
eq(Object *env, Object *a, Object *b)
|
cmp(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
if(a == b)
|
Object *a = eval(env, list->car);
|
||||||
return 1;
|
Object *b = eval(env, list->cdr->car);
|
||||||
if(a->type != b->type)
|
if(a->type != OINT || b->type != OINT)
|
||||||
return 0;
|
error("cmp only take [INT]");
|
||||||
switch(a->type){
|
return a->num - b->num;
|
||||||
default: error("eq only compare [INT]");
|
|
||||||
case OSTRING: return strequal(a, b);
|
|
||||||
case OINT: return a->num == b->num;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
fneq(Object *env, Object *list)
|
fneq(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
Object *a = eval(env, list->car);
|
return newint(gc, cmp(env, list) == 0);
|
||||||
Object *b = eval(env, list->cdr->car);
|
}
|
||||||
return newint(gc, eq(env, a, b));
|
|
||||||
|
Object*
|
||||||
|
fnge(Object *env, Object *list)
|
||||||
|
{
|
||||||
|
return newint(gc, cmp(env, list) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object*
|
||||||
|
fngt(Object *env, Object *list)
|
||||||
|
{
|
||||||
|
return newint(gc, cmp(env, list) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object*
|
||||||
|
fnle(Object *env, Object *list)
|
||||||
|
{
|
||||||
|
return newint(gc, cmp(env, list) <= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object*
|
||||||
|
fnlt(Object *env, Object *list)
|
||||||
|
{
|
||||||
|
return newint(gc, cmp(env, list) < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object*
|
||||||
|
fnne(Object *env, Object *list)
|
||||||
|
{
|
||||||
|
return newint(gc, cmp(env, list) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* (if ((cond) val)* )
|
|
||||||
* (if ((eq x y) 0) ((eq x z ) 1) (default))
|
|
||||||
*/
|
|
||||||
Object*
|
Object*
|
||||||
fnif(Object *env, Object *list)
|
fnif(Object *env, Object *list)
|
||||||
{
|
{
|
||||||
if(list == 0 || list == &Nil)
|
if(list == 0 || list == &Nil)
|
||||||
return newint(gc, 0);
|
error("Malformed if stmt");
|
||||||
Object *t = eval(env, list->car->car);
|
Object *t = eval(env, list->car->car);
|
||||||
if(istrue(t))
|
if(istrue(t))
|
||||||
return eval(env, list->car->cdr->car);
|
return eval(env, list->car->cdr->car);
|
||||||
|
|||||||
8
gc.c
8
gc.c
@ -273,7 +273,9 @@ gcrun(GC *src)
|
|||||||
}
|
}
|
||||||
gcmark(src);
|
gcmark(src);
|
||||||
gcsweep(src);
|
gcsweep(src);
|
||||||
gccompact(src->cap + 500, src);
|
if(src->using >= src->cap * 0.5){
|
||||||
|
gccompact(src->cap * 2, src);
|
||||||
|
}
|
||||||
longjmp(reg, 1);
|
longjmp(reg, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,9 +311,9 @@ newgc(void *top, int cap)
|
|||||||
gc->using = 0;
|
gc->using = 0;
|
||||||
|
|
||||||
gc->op = gc->ob = (u64)gc->memory;
|
gc->op = gc->ob = (u64)gc->memory;
|
||||||
gc->oe = gc->op + (float)cap * 0.64;
|
gc->oe = gc->op + (float)cap * 0.75;
|
||||||
|
|
||||||
gc->sb = (u64)gc->memory + (float)cap * 0.64;
|
gc->sb = (u64)gc->memory + (float)cap * 0.75;
|
||||||
gc->se = (u64)gc->memory + cap;
|
gc->se = (u64)gc->memory + cap;
|
||||||
return gc;
|
return gc;
|
||||||
}
|
}
|
||||||
|
|||||||
5
obj.c
5
obj.c
@ -51,8 +51,9 @@ Object*
|
|||||||
newsymbol(GC *gc, char *str, int len)
|
newsymbol(GC *gc, char *str, int len)
|
||||||
{
|
{
|
||||||
static Object *syms[] = {
|
static Object *syms[] = {
|
||||||
&Nil, &Minus, &Plus, &Mul, &Mod, &Div,
|
&Nil, &Minus, &Plus, &Mul, &Mod, &Div, &Ge, &Le,
|
||||||
&Lambda, &Car, &Cdr, &Quote, &Cons, &Define, &Setq, &Eq, &If,
|
&Lt, &Gt, &Ne, &Lambda, &Car, &Cdr, &Quote, &Cons,
|
||||||
|
&Define, &Setq, &Eq, &If,
|
||||||
};
|
};
|
||||||
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