refactor lisp runtime to use vec_t* instead of ivec_t*

bit nicer to look at, should have about the same painful performance
hit anyway.
This commit is contained in:
2025-08-20 22:43:23 +01:00
parent 6e2db6825d
commit 13142dc7f3
4 changed files with 15 additions and 23 deletions

14
alisp.h
View File

@@ -53,7 +53,9 @@ typedef struct Vector
void *data;
} vec_t;
#define VEC_MULT 2
#define VEC_MULT 2
#define VEC_DEFAULT_CAPACITY 8
void vec_free(vec_t *);
void vec_ensure_free(vec_t *, u64);
void vec_append(vec_t *, void *, u64);
@@ -103,12 +105,6 @@ typedef struct
lisp_t *car, *cdr;
} cons_t;
typedef struct
{
// 2 levels of indirection... disgusting
void *data;
} lvec_t;
/// System context - essentially something to help with system management
typedef struct
{
@@ -129,7 +125,7 @@ lisp_t *cons(sys_t *, lisp_t *, lisp_t *);
i64 as_int(lisp_t *);
sv_t *as_sym(lisp_t *);
cons_t *as_cons(lisp_t *);
void *as_vec(lisp_t *);
vec_t *as_vec(lisp_t *);
#define CAR(L) (as_cons(L)->car)
#define CDR(L) (as_cons(L)->cdr)
@@ -174,6 +170,6 @@ tag_t get_tag(lisp_t *);
lisp_t *tag_int(i64);
lisp_t *tag_sym(sv_t *);
lisp_t *tag_cons(cons_t *);
lisp_t *tag_vec(lvec_t *);
lisp_t *tag_vec(vec_t *);
#endif

View File

@@ -34,9 +34,9 @@ lisp_t *cons(sys_t *sys, lisp_t *car, lisp_t *cdr)
lisp_t *make_vec(sys_t *sys, u64 capacity)
{
lvec_t *lvec = calloc(1, sizeof(*lvec));
ivec_make(&lvec->data, capacity);
lisp_t *ptr = tag_vec(lvec);
vec_t *vec = calloc(1, sizeof(*vec));
vec_ensure_free(vec, MAX(capacity, VEC_DEFAULT_CAPACITY));
lisp_t *ptr = tag_vec(vec);
sys_register(sys, ptr);
return ptr;
}

6
sys.c
View File

@@ -57,9 +57,9 @@ void sys_cleanup(sys_t *sys)
break;
case TAG_VEC:
{
lvec_t *lvec = as_vec(allocated);
ivec_free(&lvec->data);
free(lvec);
vec_t *vec = as_vec(allocated);
vec_free(vec);
free(vec);
break;
}
case TAG_NIL:

12
tag.c
View File

@@ -27,9 +27,9 @@ lisp_t *tag_sym(sv_t *str)
return TAG((u64)str, SYM);
}
lisp_t *tag_vec(lvec_t *lvec)
lisp_t *tag_vec(vec_t *vec)
{
return TAG((u64)lvec, VEC);
return TAG((u64)vec, VEC);
}
lisp_t *tag_cons(cons_t *cons)
@@ -69,12 +69,8 @@ cons_t *as_cons(lisp_t *obj)
return (cons_t *)UNTAG(obj, CONS);
}
void *as_vec(lisp_t *obj)
vec_t *as_vec(lisp_t *obj)
{
assert(IS_TAG(obj, VEC));
lvec_t *vec = (lvec_t *)UNTAG(obj, VEC);
if (vec)
return vec->data;
else
return NULL;
return (vec_t *)UNTAG(obj, VEC);
}