95 lines
1.7 KiB
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);
|
|
}
|