diff --git a/bltin.c b/bltin.c index c3060ca..87f0ca2 100644 --- a/bltin.c +++ b/bltin.c @@ -14,6 +14,7 @@ Object Lt = (Object){.type=OBLTIN, .beg= "<"}; Object Gt = (Object){.type=OBLTIN, .beg= ">"}; Object Ne = (Object){.type=OBLTIN, .beg= "!="}; Object Eq = (Object){.type=OBLTIN, .beg= "=="}; +Object Not = (Object){.type=OBLTIN, .beg= "not"}; Object Comma= (Object){.type=OBLTIN, .beg=","}; Object Bquote= (Object){.type=OBLTIN, .beg="`"}; @@ -44,6 +45,7 @@ extern Object* fncar(Object *, Object *); extern Object* fncdr(Object *, Object *); extern Object* fncons(Object *, Object *); extern Object* fneq(Object *, Object *); +extern Object* fnnot(Object *, Object *); extern Object* fnif(Object *, Object *); extern Object* fnge(Object *env, Object *list); extern Object* fngt(Object *env, Object *list); @@ -75,6 +77,7 @@ bltinlookup(Object *obj) {&Cdr ,fncdr}, {&Cons ,fncons}, {&Eq, fneq}, + {&Not, fnnot}, {&Ne, fnne}, {&If, fnif}, {&Ge, fnge}, diff --git a/dat.h b/dat.h index 3eb6166..eed8344 100644 --- a/dat.h +++ b/dat.h @@ -69,6 +69,7 @@ extern Object Progn; extern Object Macro; extern Object Setq; extern Object Eq; +extern Object Not; extern Object Ne; extern Object If; extern Object Ge; diff --git a/eval.c b/eval.c index 8de8a13..5e0a5ea 100644 --- a/eval.c +++ b/eval.c @@ -267,6 +267,14 @@ _newint(int n) return newint(gc, 1); } +Object* +fnnot(Object *env, Object *list) +{ + if(list->type != OCELL || exprlen(list)!= 1) + error("Malformed not"); + return _newint(list->car == &Nil); +} + Object* fneq(Object *env, Object *list) { diff --git a/obj.c b/obj.c index 82f04db..ce51c90 100644 --- a/obj.c +++ b/obj.c @@ -63,7 +63,7 @@ newsymbol(GC *gc, char *str, int len) &Nil, &Minus, &Plus, &Mul, &Mod, &Div, &Ge, &Le, &Lt, &Gt, &Ne, &Lambda, &Car, &Cdr, &Quote, &Cons, &Define, &Setq, &Eq, &If, &Macro, &Progn, &Bquote, - &Comma, + &Comma, &Not, }; for(int i = 0; i < sizeof(syms)/sizeof(syms[0]); ++i){ Object *c = syms[i];