Make nicer primitive functions for car/cdr
If it isn't a CONS, we return NIL instead of failing. This way, we can use it in our general iteration functions. Eventually the actual runtime would use this as well. The macros are mostly for internal use to do assignment etc.
This commit is contained in:
3
alisp.h
3
alisp.h
@@ -126,6 +126,9 @@ vec_t *as_vec(lisp_t *);
|
||||
#define CAR(L) (as_cons(L)->car)
|
||||
#define CDR(L) (as_cons(L)->cdr)
|
||||
|
||||
lisp_t *car(lisp_t *);
|
||||
lisp_t *cdr(lisp_t *);
|
||||
|
||||
/// Pointer tagging scheme for lisps
|
||||
|
||||
typedef enum Tag
|
||||
|
||||
@@ -46,3 +46,19 @@ lisp_t *intern(sys_t *sys, sv_t sv)
|
||||
char *str = sym_table_find(&sys->symtable, sv);
|
||||
return tag_sym(str);
|
||||
}
|
||||
|
||||
lisp_t *car(lisp_t *lsp)
|
||||
{
|
||||
if (!IS_TAG(lsp, CONS))
|
||||
return NIL;
|
||||
else
|
||||
return CAR(lsp);
|
||||
}
|
||||
|
||||
lisp_t *cdr(lisp_t *lsp)
|
||||
{
|
||||
if (!IS_TAG(lsp, CONS))
|
||||
return NIL;
|
||||
else
|
||||
return CDR(lsp);
|
||||
}
|
||||
|
||||
9
sys.c
9
sys.c
@@ -43,12 +43,13 @@ void sys_cleanup(sys_t *sys)
|
||||
return;
|
||||
|
||||
// Iterate through each element of memory
|
||||
for (lisp_t *cell = sys->memory, *next = CDR(cell); cell;
|
||||
cell = next, next = CDR(cell))
|
||||
for (lisp_t *cell = sys->memory, *next = cdr(cell); cell;
|
||||
cell = next, next = cdr(next))
|
||||
{
|
||||
// Only reason allocated exists is because we had to allocate memory on the
|
||||
// heap for it. It's therefore
|
||||
lisp_t *allocated = CAR(cell);
|
||||
// heap for it. It's therefore enough to deal with only the allocated
|
||||
// types.
|
||||
lisp_t *allocated = car(cell);
|
||||
switch (get_tag(allocated))
|
||||
{
|
||||
case TAG_CONS:
|
||||
|
||||
Reference in New Issue
Block a user