diff --git a/builtin.c b/builtin.c index dca3d6ff..f5917cbe 100644 --- a/builtin.c +++ b/builtin.c @@ -552,6 +552,9 @@ static const char* jq_builtins[] = { "def max_by(f): _max_by_impl(map([f]));", "def min_by(f): _min_by_impl(map([f]));", "def del(f): delpaths([path(f)]);", + "def _assign(paths; value): value as $v | fold . as $obj (path(paths) as $p | $obj | setpath($p; $v));", + "def _modify(paths; update): fold . as $obj (path(paths) as $p | $obj | setpath($p; getpath($p) | update));", + }; diff --git a/compile.c b/compile.c index 178b0463..08187836 100644 --- a/compile.c +++ b/compile.c @@ -317,22 +317,6 @@ block gen_fold(const char* varname, block init, block fold) { OP_HAS_VARIABLE)); } -block gen_assign(block expr) { - block result_var = block_bind(gen_op_var_unbound(STOREV, "result"), - gen_noop(), OP_HAS_VARIABLE); - - block loop = BLOCK(gen_op_simple(DUP), - expr, - gen_op_var_bound(ASSIGN, result_var), - gen_op_simple(BACKTRACK)); - - return BLOCK(gen_op_simple(DUP), - result_var, - gen_op_target(FORK, loop), - loop, - gen_op_var_bound(LOADV, result_var)); -} - block gen_definedor(block a, block b) { // var found := false block found_var = block_bind(gen_op_var_unbound(STOREV, "found"), diff --git a/compile.h b/compile.h index ce1b3089..150eef28 100644 --- a/compile.h +++ b/compile.h @@ -34,7 +34,6 @@ block gen_subexp(block a); block gen_both(block a, block b); block gen_collect(block expr); block gen_fold(const char* varname, block init, block body); -block gen_assign(block expr); block gen_definedor(block a, block b); block gen_condbranch(block iftrue, block iffalse); block gen_and(block a, block b); diff --git a/execute.c b/execute.c index ed251d18..94f6cd43 100644 --- a/execute.c +++ b/execute.c @@ -298,34 +298,6 @@ jv jq_next() { break; } - case ASSIGN: { - stackval replacement = stack_pop(); - stackval path_end = stack_pop(); - stackval path_start = stack_pop(); - jv_free(path_end.value); - jv_free(path_start.value); - - jv path = jv_array(); - for (int i=path_start.pathidx; i