Reader
This commit is contained in:
+74
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user