add <, >, ==, != bltin

This commit is contained in:
yoyo 2024-09-02 23:09:07 +09:00
parent bb623c9c20
commit 275c03f518
7 changed files with 79 additions and 34 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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];

View File

@ -6,7 +6,7 @@
#define SYMBOL_LEN 64 #define SYMBOL_LEN 64
const char symbolchars[] = "*/%-=+<>'"; const char symbolchars[] = "!*/%-=+<>'";
static Object* lparlist(void); static Object* lparlist(void);
static Object* list(void); static Object* list(void);