static int exec_call(strm_stream* strm, strm_state* state, strm_string name, int argc, strm_value* argv, strm_value* ret) { int n = STRM_NG; strm_value m; if (argc > 0) { strm_state* ns = strm_value_ns(argv[0]); if (ns) { n = strm_var_get(ns, name, &m); } else if (argc == 1 && strm_array_p(argv[0])) { m = strm_str_value(name); n = ary_get(strm, argv[0], 1, &m, ret); if (n == STRM_OK) return STRM_OK; } } if (n == STRM_NG) { n = strm_var_get(state, name, &m); } if (n == STRM_OK) { return strm_funcall(strm, m, argc, argv, ret); } strm_raise(strm, "function not found"); return STRM_NG; }
int strm_funcall(strm_stream* strm, strm_value func, int argc, strm_value* argv, strm_value* ret) { switch (strm_value_tag(func)) { case STRM_TAG_CFUNC: return (strm_value_cfunc(func))(strm, argc, argv, ret); case STRM_TAG_ARRAY: return ary_get(strm, func, argc, argv, ret); case STRM_TAG_PTR: if (!strm_lambda_p(func)) { strm_raise(strm, "not a function"); return STRM_NG; } else { return lambda_call(strm, func, argc, argv, ret); } default: strm_raise(strm, "not a function"); break; } return STRM_NG; }
int strm_funcall(strm_state* state, strm_value func, int argc, strm_value* argv, strm_value* ret) { switch (strm_value_tag(func)) { case STRM_TAG_CFUNC: return (strm_value_cfunc(func))(state, argc, argv, ret); case STRM_TAG_ARRAY: return ary_get(state, func, argc, argv, ret); case STRM_TAG_PTR: if (!strm_lambda_p(func)) { strm_raise(state, "not a function"); return STRM_NG; } else { strm_lambda lambda = strm_value_lambda(func); node_lambda* nlbd = lambda->body; node_args* args = (node_args*)nlbd->args; strm_state c = {0}; int i, n; c.prev = lambda->state; if ((args == NULL && argc != 0) && (args->len != argc)) return STRM_NG; for (i=0; i<argc; i++) { n = strm_var_set(&c, node_to_sym(args->data[i]), argv[i]); if (n) return n; } n = exec_expr(&c, nlbd->compstmt, ret); if (c.exc && c.exc->type == NODE_ERROR_RETURN) { *ret = c.exc->arg; return STRM_OK; } return n; } default: break; } return STRM_NG; }