// proc assert_type(Lisp_Object*, Lisp_Object_Type) -> void; proc built_in_load(String*) -> Lisp_Object*; proc built_in_import(String*) -> Lisp_Object*; proc create_error(const char* c_file_name, int c_file_line, Lisp_Object* type, String* message) -> void; proc create_error(const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...) -> void; proc create_error(Lisp_Object* type, const char* message, const char* c_file_name, int c_file_line) -> void; proc eval_arguments(Lisp_Object*, int*) -> Lisp_Object*; proc eval_expr(Lisp_Object*) -> Lisp_Object*; proc is_truthy (Lisp_Object*) -> bool; proc list_length(Lisp_Object*) -> int; proc load_built_ins_into_environment() -> void; proc parse_argument_list(Lisp_Object*, Function*) -> void; proc print_environment(Environment*) -> void; inline proc get_root_environment() -> Environment*; inline proc get_current_environment() -> Environment*; inline proc push_environment(Environment*) -> void; inline proc pop_environment() -> void; proc Lisp_Object_Type_to_string(Lisp_Object_Type type) -> const char*; proc visualize_lisp_machine() -> void; proc generate_docs(String* path) -> void; namespace Memory { proc create_built_ins_environment() -> Environment*; proc get_or_create_lisp_object_keyword(const char* identifier) -> Lisp_Object*; inline proc get_type(Lisp_Object* node) -> Lisp_Object_Type; } namespace Parser { // extern Environment* environment_for_macros; extern String* standard_in; extern String* parser_file; extern int parser_line; extern int parser_col; } namespace Globals { char* bin_path = nullptr; Log_Level log_level = Log_Level::Debug; namespace Current_Execution { Lisp_Object_Array_List call_stack = create_Lisp_Object_array_list(); Environment_Array_List envi_stack = create_Environment_array_list(); } #ifdef _DONT_BREAK_ON_ERRORS bool breaking_on_errors = false; #else bool breaking_on_errors = true; #endif Error* error = nullptr; }