Add try/throw
This commit is contained in:
parent
cc302bc17c
commit
6cce0e5595
34
ell.c
34
ell.c
|
@ -1044,6 +1044,38 @@ defn (fn_parse) {
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defn (fn_try) {
|
||||||
|
struct item *body = args, *handler;
|
||||||
|
if (!body || body->type != ITEM_LIST)
|
||||||
|
return set_error (ctx, "first argument must be a function");
|
||||||
|
if (!(handler = body->next) || handler->type != ITEM_LIST)
|
||||||
|
return set_error (ctx, "second argument must be a function");
|
||||||
|
if (execute (ctx, body->head, result))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
struct item *message;
|
||||||
|
if (ctx->memory_failure
|
||||||
|
|| !check (ctx, (message = new_string (ctx->error, strlen (ctx->error)))))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
free (ctx->error); ctx->error = NULL;
|
||||||
|
item_free_list (*result); *result = NULL;
|
||||||
|
|
||||||
|
bool ok = set_single_argument (ctx, message)
|
||||||
|
&& execute (ctx, handler->head, result);
|
||||||
|
item_free (message);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
defn (fn_throw) {
|
||||||
|
(void) result;
|
||||||
|
|
||||||
|
struct item *message = args;
|
||||||
|
if (!message || message->type != ITEM_STRING)
|
||||||
|
return set_error (ctx, "first argument must be string");
|
||||||
|
return set_error (ctx, message->value);
|
||||||
|
}
|
||||||
|
|
||||||
defn (fn_plus) {
|
defn (fn_plus) {
|
||||||
double res = 0.0;
|
double res = 0.0;
|
||||||
for (; args; args = args->next) {
|
for (; args; args = args->next) {
|
||||||
|
@ -1226,6 +1258,8 @@ init_runtime_library (struct context *ctx) {
|
||||||
&& native_register (ctx, "..", fn_concatenate)
|
&& native_register (ctx, "..", fn_concatenate)
|
||||||
&& native_register (ctx, "system", fn_system)
|
&& native_register (ctx, "system", fn_system)
|
||||||
&& native_register (ctx, "parse", fn_parse)
|
&& native_register (ctx, "parse", fn_parse)
|
||||||
|
&& native_register (ctx, "try", fn_try)
|
||||||
|
&& native_register (ctx, "throw", fn_throw)
|
||||||
&& native_register (ctx, "+", fn_plus)
|
&& native_register (ctx, "+", fn_plus)
|
||||||
&& native_register (ctx, "-", fn_minus)
|
&& native_register (ctx, "-", fn_minus)
|
||||||
&& native_register (ctx, "*", fn_multiply)
|
&& native_register (ctx, "*", fn_multiply)
|
||||||
|
|
Loading…
Reference in New Issue