lval * ast_load_eval(char* fn, lenv *env) { lval *r; mpc_result_t parsed; lval *ast; lval *result; if (mpc_parse_contents(fn, Lispy, &parsed)) { ast = ast_read(parsed.output); mpc_ast_delete(parsed.output); while (ast->expr->count) { result = lval_eval(expr_pop(ast->expr, 0), env); if (result->type == LVAL_ERR) lval_println(result); lval_del(result); } lval_del(ast); r = lval_sexpr(); } else { char *err = mpc_err_string(parsed.error); mpc_err_delete(parsed.error); r = lval_err(err); free(err); } return r; }
ussval_t* builtin_load(ussenv_t* e, ussval_t* a) { UASSERT_NUM("load", a, 1); UASSERT_TYPE("load", a, 0, UVAL_STR); /* Parse File given by string name */ mpc_result_t r; parser_t *parser = parser_toplevel(); if (mpc_parse_contents(a->cell[0]->str, parser->uss, &r)) { fprintf(stderr, "DEBUG: loading: %s\n", a->cell[0]->str); ussenv_put(e, ussval_new_sym("file-path"), a->cell[0]); ussenv_put(e, ussval_new_sym("file-dir"), ussval_new_str(dirname(a->cell[0]->str))); /* Read contents */ ussval_t *expr = ussval_read(r.output); mpc_ast_delete(r.output); /* Evaluate each Expression */ while (expr->count) { ussval_t *x = ussval_eval(e, ussval_pop(expr, 0)); /* If Evaluation leads to error print it */ if (x->type == UVAL_ERR) { ussval_println(x); } ussval_del(x); } /* Delete expressions and arguments */ ussval_del(expr); ussval_del(a); parser_cleanup(parser); //lenv_put(e, lval_sym("file-path"), LVAL_NIL); //lenv_put(e, lval_sym("file-dir"), LVAL_NIL); /* Return empty list */ return ussval_new_sexpr(); } else { /* Get Parse Error as String */ char *err_msg = mpc_err_string(r.error); mpc_err_delete(r.error); /* Create new error message using it */ ussval_t *err = ussval_new_err("Could not load Library %s", err_msg); free(err_msg); ussval_del(a); parser_cleanup(parser); /* Cleanup and return error */ return err; } }
lval* builtin_load(lenv* e, lval* a) { LASSERT_NUM("load", a, 1); LASSERT_TYPE("load", a, 0, LVAL_STR); //Parse file given by string as filename mpc_result_t r; if (mpc_parse_contents(a->cell[0]->str, blisp, &r)) { //Read Contents lval* expr = lval_read(r.output); mpc_ast_delete(r.output); //Evaluate expressions on stack while (expr->count) { lval* x = lval_eval(e, lval_pop(expr, 0)); if (x->type == LVAL_ERR) { lval_println(x); } lval_del(x); } //Delete expression and args lval_del(expr); lval_del(a); //Return empty list return lval_sexpr(); } else { //Get error message as string and return as lval_err char* err_msg = mpc_err_string(r.error); mpc_err_delete(r.error); lval* err = lval_err("Could not load Library %s", err_msg); free(err_msg); lval_del(a); //Cleanup and return error return err; } }