1
0
Fork 0
lesson-lisp/src/main.c

95 lines
1.7 KiB
C

#include "eval.h"
#include "lexer.h"
#include "object.h"
#include "parser.h"
#include "tokens.h"
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
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);
}