This commit is contained in:
2026-01-16 03:20:38 -08:00
parent e0d8693840
commit 94d5749d31
19 changed files with 1358 additions and 3 deletions
+74
View File
@@ -0,0 +1,74 @@
#include "base.h"
#include <string.h>
const char *LISP_TYPE_NAMES[N_LISP_TYPES] = {
[TYPE_FIXNUM] = "fixnum",
[TYPE_FLOAT] = "float",
[TYPE_CONS] = "cons",
[TYPE_STRING] = "string",
[TYPE_SYMBOL] = "symbol",
[TYPE_VECTOR] = "vector",
[TYPE_HASH_TABLE] = "hash-table",
[TYPE_FUNCTION] = "function",
};
void *lisp_alloc_object(size_t size, LispValType type) {
assert(size >= sizeof(LispObject));
LispObject *obj = lisp_aligned_alloc(LISP_OBJECT_ALIGNMENT, size);
obj->gc.immortal = false;
obj->gc.mark = false;
// TODO set the below
obj->gc.entry = NULL;
obj->type = type;
return obj;
}
DEFINE_SYMBOL(nil, "nil");
DEFINE_SYMBOL(t, "t");
DEFINE_SYMBOL(unbound, "unbound");
// ################
// # Constructors #
// ################
LispVal *make_lisp_string(const char *data, size_t length, bool take,
bool copy) {
LispString *obj = lisp_alloc_object(sizeof(LispString), TYPE_STRING);
obj->owned = take;
obj->length = length;
if (copy) {
obj->data = lisp_malloc(length + 1);
memcpy(obj->data, data, length);
obj->data[length] = '\0';
} else {
obj->data = (char *) data;
}
return obj;
}
LispVal *make_vector(LispVal **data, size_t length, bool take) {
LispVector *obj = lisp_alloc_object(sizeof(LispVector), TYPE_VECTOR);
obj->length = length;
if (take) {
obj->data = data;
} else {
obj->data = lisp_malloc(sizeof(LispVal *) * length);
memcpy(obj->data, data, sizeof(LispVal *) * length);
}
return obj;
}
DEFUN(make_symbol, "make-symbol", (LispVal * name), "(name)",
"Return an uninterned symbol called NAME.") {
LispSymbol *obj = lisp_alloc_object(sizeof(LispSymbol), TYPE_SYMBOL);
obj->name = name;
obj->function = Qnil;
obj->value = Qnil;
obj->plist = Qnil;
return obj;
}
DEFUN(intern, "intern", (LispVal * name), "(name)", "") {
// TODO implement
return Fmake_symbol(name);
}