|
- #define _CRT_SECURE_NO_DEPRECATE
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdarg.h> /* needed for va_list */
- #include <ctype.h>
- #include <math.h>
-
- #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();
- }
- }
|