proc create_source_code_location(String* file, int line, int col) -> Source_Code_Location* { if (!file) return nullptr; Source_Code_Location* ret = (Source_Code_Location*)malloc(sizeof(Source_Code_Location)); ret->file = file; ret->line = line; ret->column = col; return ret; } proc Lisp_Object_Type_to_string(Lisp_Object_Type type) -> const char* { switch (type) { case(Lisp_Object_Type::Nil): return "nil"; case(Lisp_Object_Type::T): return "t"; case(Lisp_Object_Type::Number): return "number"; case(Lisp_Object_Type::String): return "string"; case(Lisp_Object_Type::Symbol): return "symbol"; case(Lisp_Object_Type::Keyword): return "keyword"; case(Lisp_Object_Type::Function): return "function"; case(Lisp_Object_Type::CFunction): return "C-function"; case(Lisp_Object_Type::Continuation): return "continuation"; case(Lisp_Object_Type::Pair): return "pair"; case(Lisp_Object_Type::Vector): return "vector"; case(Lisp_Object_Type::Pointer): return "pointer"; case(Lisp_Object_Type::HashMap): return "hashmap"; } return "unknown"; } Lisp_Object::~Lisp_Object() { free(sourceCodeLocation); sourceCodeLocation = 0; switch (Memory::get_type(this)) { case Lisp_Object_Type::HashMap: { delete this->value.hashMap; } break; case Lisp_Object_Type::CFunction: { this->value.cFunction->args.positional.symbols.~Array_List(); this->value.cFunction->args.keyword.keywords.~Array_List(); this->value.cFunction->args.keyword.values.~Array_List(); delete this->value.cFunction; } break; case Lisp_Object_Type::Function:{ this->value.function->args.positional.symbols.~Array_List(); this->value.function->args.keyword.keywords.~Array_List(); this->value.function->args.keyword.values.~Array_List(); delete this->value.function; } break; default: break; } }