aboutsummaryrefslogtreecommitdiff
path: root/ell.c
diff options
context:
space:
mode:
Diffstat (limited to 'ell.c')
-rwxr-xr-xell.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/ell.c b/ell.c
index d925523..6becbe9 100755
--- a/ell.c
+++ b/ell.c
@@ -756,11 +756,12 @@ execute_args (struct context *ctx, struct item *args, struct item **res) {
struct item *evaluated = NULL;
if (!execute_statement (ctx, args, &evaluated))
return false;
- if (evaluated) {
- item_free_list (evaluated->next);
- evaluated->next = NULL;
- res = &(*res = evaluated)->next;
- }
+ // Arguments should not evaporate, default to a nil value
+ if (!evaluated && !check (ctx, (evaluated = new_list (NULL))))
+ return false;
+ item_free_list (evaluated->next);
+ evaluated->next = NULL;
+ res = &(*res = evaluated)->next;
}
return true;
}
@@ -806,8 +807,8 @@ execute_statement
if (statement->type == ITEM_STRING)
return check (ctx, (*result = new_clone (statement)));
- // XXX: should this ever happen and what are the consequences?
- // Shouldn't we rather clone the empty list?
+ // Executing a nil value results in no value. It's not very different from
+ // calling a block that returns no value--it's for our callers to resolve.
struct item *body;
if (!(body = statement->head))
return true;