proc create_source_code_location(String* file, int line, int col) -> Source_Code_Location* { if (!file) return nullptr; Source_Code_Location* ret = new(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"; } return "unknown"; } proc create_positional_argument_list(int initial_capacity) -> Positional_Arguments { Positional_Arguments ret; ret.symbols = create_Lisp_Object_array_list(initial_capacity); return ret; } proc append_to_positional_argument_list(Positional_Arguments* args, Lisp_Object* sym) -> void { append_to_array_list(&args->symbols, sym); } proc create_keyword_argument_list(int initial_capacity) -> Keyword_Arguments { Keyword_Arguments ret; ret.keywords = create_Lisp_Object_array_list(initial_capacity); ret.values = create_Lisp_Object_array_list(initial_capacity); return ret; } proc append_to_keyword_argument_list(Keyword_Arguments* args, Lisp_Object* keyword, Lisp_Object* default_value) -> void { append_to_array_list(&args->keywords, keyword); append_to_array_list(&args->values, default_value); }