some memory management
This commit is contained in:
+23
-32
@@ -1,11 +1,3 @@
|
||||
// forward decls -- start
|
||||
void load_built_ins_into_environment(Environment*);
|
||||
Lisp_Object* eval_expr(Lisp_Object*, Environment*);
|
||||
void parse_argument_list(Lisp_Object*, Function*);
|
||||
int list_length(Lisp_Object*);
|
||||
// forward decls -- end
|
||||
|
||||
|
||||
namespace Parser {
|
||||
|
||||
#define inject_scl(_ret) \
|
||||
@@ -113,7 +105,7 @@ namespace Parser {
|
||||
double number;
|
||||
char* str_number = read_atom(text, index_in_text);
|
||||
sscanf(str_number, "%lf", &number);
|
||||
Lisp_Object* ret = create_lisp_object_number(number);
|
||||
Lisp_Object* ret = Memory::create_lisp_object_number(number);
|
||||
inject_scl(ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -123,7 +115,7 @@ namespace Parser {
|
||||
++(*index_in_text);
|
||||
++parser_col;
|
||||
char* str_keyword = read_atom(text, index_in_text);
|
||||
Lisp_Object* ret = create_lisp_object_keyword(str_keyword);
|
||||
Lisp_Object* ret = Memory::create_lisp_object_keyword(str_keyword);
|
||||
inject_scl(ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -131,7 +123,7 @@ namespace Parser {
|
||||
Lisp_Object* parse_symbol(char* text, int* index_in_text) {
|
||||
// we are now at the first char of the symbol
|
||||
char* str_symbol = read_atom(text, index_in_text);
|
||||
Lisp_Object* ret = create_lisp_object_symbol(str_symbol);
|
||||
Lisp_Object* ret = Memory::create_lisp_object_symbol(str_symbol);
|
||||
inject_scl(ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -146,7 +138,7 @@ namespace Parser {
|
||||
if (text[*index_in_text] == '"') {
|
||||
char* str = new(char);
|
||||
*str = '\0';
|
||||
Lisp_Object* ret = create_lisp_object_string(str, 0);
|
||||
Lisp_Object* ret = Memory::create_lisp_object_string(str, 0);
|
||||
inject_scl(ret);
|
||||
|
||||
// plus one because we want to go after the quotes
|
||||
@@ -187,7 +179,7 @@ namespace Parser {
|
||||
*index_in_text += string_length +1; // plus one because we want to
|
||||
// go after the quotes
|
||||
|
||||
Lisp_Object* ret = create_lisp_object_string(string, string_length);
|
||||
Lisp_Object* ret = Memory::create_lisp_object_string(string, string_length);
|
||||
inject_scl(ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -246,17 +238,17 @@ namespace Parser {
|
||||
}
|
||||
|
||||
if (quoteType == '\'')
|
||||
return create_lisp_object_pair(
|
||||
create_lisp_object_symbol("quote"),
|
||||
create_lisp_object_pair(result, create_lisp_object_nil()));
|
||||
return Memory::create_lisp_object_pair(
|
||||
Memory::create_lisp_object_symbol("quote"),
|
||||
Memory::create_lisp_object_pair(result, Memory::create_lisp_object_nil()));
|
||||
else if (quoteType == '`')
|
||||
return create_lisp_object_pair(
|
||||
create_lisp_object_symbol("quasiquote"),
|
||||
create_lisp_object_pair(result, create_lisp_object_nil()));
|
||||
return Memory::create_lisp_object_pair(
|
||||
Memory::create_lisp_object_symbol("quasiquote"),
|
||||
Memory::create_lisp_object_pair(result, Memory::create_lisp_object_nil()));
|
||||
// it has to be an unquote
|
||||
return create_lisp_object_pair(
|
||||
create_lisp_object_symbol("unquote"),
|
||||
create_lisp_object_pair(result, create_lisp_object_nil()));
|
||||
return Memory::create_lisp_object_pair(
|
||||
Memory::create_lisp_object_symbol("unquote"),
|
||||
Memory::create_lisp_object_pair(result, Memory::create_lisp_object_nil()));
|
||||
}
|
||||
|
||||
|
||||
@@ -271,11 +263,11 @@ namespace Parser {
|
||||
if (text[(*index_in_text)] == ')') {
|
||||
++(*index_in_text);
|
||||
++parser_col;
|
||||
return create_lisp_object_nil();
|
||||
return Memory::create_lisp_object_nil();
|
||||
}
|
||||
|
||||
// okay there is something
|
||||
Lisp_Object* head = new(Lisp_Object);
|
||||
Lisp_Object* head = Memory::create_lisp_object();
|
||||
head->type = Lisp_Object_Type::Pair;
|
||||
head->value.pair = new(Pair);
|
||||
Lisp_Object* expression = head;
|
||||
@@ -303,7 +295,7 @@ namespace Parser {
|
||||
|
||||
|
||||
if (text[(*index_in_text)] == ')') {
|
||||
head->value.pair->rest = create_lisp_object_nil();
|
||||
head->value.pair->rest = Memory::create_lisp_object_nil();
|
||||
++parser_col;
|
||||
++(*index_in_text);
|
||||
break;
|
||||
@@ -325,7 +317,7 @@ namespace Parser {
|
||||
++(*index_in_text);
|
||||
break;
|
||||
} else {
|
||||
head->value.pair->rest = create_lisp_object_pair(nullptr, nullptr);
|
||||
head->value.pair->rest = Memory::create_lisp_object_pair(nullptr, nullptr);
|
||||
head = head->value.pair->rest;
|
||||
}
|
||||
}
|
||||
@@ -387,17 +379,17 @@ namespace Parser {
|
||||
|
||||
// we are now in the function body, just wrap it in an
|
||||
// implicit prog
|
||||
function->body = create_lisp_object_pair(
|
||||
create_lisp_object_symbol("prog"),
|
||||
function->body = Memory::create_lisp_object_pair(
|
||||
Memory::create_lisp_object_symbol("prog"),
|
||||
arguments);
|
||||
|
||||
Lisp_Object* macro = new(Lisp_Object);
|
||||
Lisp_Object* macro = Memory::create_lisp_object();
|
||||
macro->type = Lisp_Object_Type::Function;
|
||||
macro->value.function = function;
|
||||
define_symbol(symbol_for_macro, macro, environment_for_macros);
|
||||
|
||||
// print_environment(environment_for_macros);
|
||||
return create_lisp_object_nil();
|
||||
return Memory::create_lisp_object_nil();
|
||||
|
||||
} else if (string_equal("delete-syntax", expression->value.pair->first->value.symbol->identifier)) {
|
||||
/* --- deleting an existing macro --- */
|
||||
@@ -453,7 +445,7 @@ namespace Parser {
|
||||
Lisp_Object* result;
|
||||
eat_until_code(text, &index_in_text);
|
||||
if (text[(index_in_text)] == '\0')
|
||||
return create_lisp_object_nil();
|
||||
return Memory::create_lisp_object_nil();
|
||||
if (text[index_in_text] == '(' ||
|
||||
text[index_in_text] == '\'' ||
|
||||
text[index_in_text] == '`' ||
|
||||
@@ -536,5 +528,4 @@ namespace Parser {
|
||||
}
|
||||
|
||||
#undef inject_scl
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user