view src/bin/ylisp.c @ 168:5697df53fe81

bin: Add interpreter binary src/bin/ylisp.
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 03 Sep 2019 20:06:59 +0200
parents
children cdf06bdd9592
line wrap: on
line source

#include <stdio.h>

#include <src/parse.h>
#include <src/preprocess.h>
#include <src/eval.h>

yexpr_t run(FILE* input, yeval_state_t* state, yvec_t** root) {
    yexpr_t file = yexpr_new();
    yexpr_t result = yexpr_new();
    ystr_t error = ystr_new(NULL);
    bool ok = yparse(input, &file, &error);
    if (!ok) {
        fprintf(stderr, "Parse error: %s\n", ystr_str(&error));
        goto clean_all;
    }
    ypreprocess_resolve_builtins(&file);
    ypreprocess_refs_repl(&file, root);
    result = yeval_list_return_last(state, &file.value.list, 0);
clean_all:
    yexpr_destroy(&file);
    ystr_destroy(&error);
    return result;
}

int main(int argc, char** argv) {
    yvec_t* root = NULL;
    yeval_state_t state;
    state.call_stack = YVEC_NEW(NULL, 16, yexpr_t);
    yexpr_t result = yexpr_new();

    if (argc == 1) {
        result = run(stdin, &state, &root);
    }

    yvec_destroy(root);
    yvec_destroy(&state.call_stack);
    yexpr_destroy(&result);
    return 0;
}