X-Git-Url: http://uxul.de/gitweb/?p=lazyeval.git;a=blobdiff_plain;f=lists.h;fp=lists.h;h=9f9b781a9137b00fd2dd576266b40bbab9b98faa;hp=0000000000000000000000000000000000000000;hb=9f57f92b36f36e6dfac6dd702432cbb4c8515f2b;hpb=551dec71ea4a993089a4b72ceb667a50ba3b6f92 diff --git a/lists.h b/lists.h new file mode 100644 index 0000000..9f9b781 --- /dev/null +++ b/lists.h @@ -0,0 +1,58 @@ +#ifndef __LISTS_H +#define __LISTS_H + +#include + +typedef int listElt; + +typedef struct { + listElt car; + void* cdr; /* cons ** cdr */ +} cons; + +typedef cons** list; + +list getNil () { + static cons nil1; + static cons * nil2 = &nil1; + return &nil2; +} + +bool isNil (list c) { + return getNil () == c; +} + +listElt car(list l) { + if (isNil(l)) { + printf("Called car of NIL!\n"); + fsync(0); + exit(-1); + } + return (*l)->car; +} + +list cdr (list l) { + if (isNil(l)) { + printf("Called cdr of NIL!\n"); + fsync(0); + exit(-1); + } + list rt = (list) (*l)->cdr; + return rt; +} + +listElt elt (list l, int eltnum) { + return (eltnum == 0) ? car(l) : elt (cdr(l), eltnum - 1); +} + +int len (list l) { + if (isNil(l)) return 0; + return len(cdr(l)); +} + +list doCons (int car, list cdr, cons * newCons) { + newCons->cdr = (void*) cdr; + newCons->car = car; +} + +#endif