#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include /* needed for va_list */ #include #include #include "./helpers.c" #include "./ast.c" #include "./error.c" #include "./io.c" #include "./assert.c" #include "./parse.c" #include "./env.c" #include "./built_ins.c" #include "./eval.c" #include "./testing.c" #include "./init.c" int interprete_file (char* file_content) { Ast_Node_Array_List* program = parse_program(file_content); if (error) { log_error(); return 1; } Environment* env = create_empty_environment(Environment_Type_Let); built_in_load("pre.slime", env); if (error) { log_error(); return 1; } Ast_Node* result = create_ast_node_nil(); for (int i = 0; i < program->next_index; ++i) { result = eval_expr(program->data[i], env); if (error) { log_error(); return 1; } } return 0; } int interprete_stdin () { printf("Welcome to the lispy interpreter.\n"); char* line; Environment* env = create_empty_environment(Environment_Type_Let); built_in_load("pre.slime", env); if (error) { log_error(); delete_error(); } Ast_Node* parsed, * evaluated; while (true) { printf(">"); line = read_line(); parsed = parse_single_expression(line); if (error) { log_error(); delete_error(); continue; } evaluated = eval_expr(parsed, env); if (error) { log_error(); delete_error(); continue; } print(evaluated); printf("\n"); } return 0; } int main (int argc, char *argv[]) { init(); if (argc > 1) { char* file_content = read_entire_file(argv[1]); if (file_content) { return interprete_file(file_content); } else { printf("The file could not be read\n"); return 1; } } else { run_all_tests(); return interprete_stdin(); } }