示例#1
0
文件: ast.c 项目: catwell/ownlisp
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;
}
示例#2
0
文件: builtin.c 项目: aktowns/USS
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;
    }
}
示例#3
0
文件: builtin.c 项目: burberger/blisp
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;
  }
}