#include "eval.h" #include "lexer.h" #include "object.h" #include "parser.h" #include "tokens.h" #include #include #include #include #include #include #include static void repl(); static void script(); int main() { const bool is_tty = isatty(fileno(stdin)); if (is_tty) { repl(); } else { script(); } exit(EXIT_SUCCESS); } void repl() { while (true) { Tokens tokens = Tokens_new(); assert(tokens); Lexer lexer = Lexer_new(tokens); assert(lexer); printf(">> "); while (true) { const char chr = getchar(); if (chr == EOF) { putchar('\n'); exit(EXIT_SUCCESS); } if (chr == '\n') break; Lexer_lex(lexer, chr); } Lexer_lex(lexer, '\n'); LEXER_DELETE(lexer); if (Tokens_top(tokens) == NULL) continue; struct Object *const program = parse(tokens); TOKENS_DELETE(tokens); struct Object *const result = eval(program); printf("=> "); eval(Object_build_list( 2, Object_new_symbol("displayln"), Object_build_list(2, Object_new_symbol("quote"), result) )); } } void script() { Tokens tokens = Tokens_new(); assert(tokens); Lexer lexer = Lexer_new(tokens); assert(lexer); while (true) { const char chr = getchar(); if (chr == EOF) break; Lexer_lex(lexer, chr); } Lexer_lex(lexer, '\n'); LEXER_DELETE(lexer); if (Tokens_top(tokens) == NULL) return; struct Object *const program = parse(tokens); TOKENS_DELETE(tokens); eval(program); }