summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-02-17 07:56:29 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-02-17 07:56:29 -0800
commite45772713089105c776556655d671102375d9a72 (patch)
treeb6201f694dac62b8375c087a97ccf437847dce52
parentcf5fbe748a05001e840d3efcdba15e8d56369ccb (diff)
downloadtxr-e45772713089105c776556655d671102375d9a72.tar.gz
txr-e45772713089105c776556655d671102375d9a72.tar.bz2
txr-e45772713089105c776556655d671102375d9a72.zip
@(call): bugfix: matching doesn't continue.
* match.c (v_call): This function must propagate the next_spec_k return value, rather than return a short-circuiting match object, which causes the parent to immediately succeed. * tests/008/call.txr: New test case, from Frank Schwidom. * tests/008/call.expected: Likewise.
-rw-r--r--match.c3
-rw-r--r--tests/008/call.expected2
-rw-r--r--tests/008/call.txr13
3 files changed, 17 insertions, 1 deletions
diff --git a/match.c b/match.c
index 1010062d..9782c937 100644
--- a/match.c
+++ b/match.c
@@ -4516,7 +4516,8 @@ static val v_call(match_files_ctx *c)
if (ret == decline_k)
sem_error(nil, lit("call: function ~s not found"), funval, nao);
- return cons(ctx.bindings, if3(ctx.data, cons(ctx.data, ctx.data_lineno), t));
+ c->bindings = ctx.bindings;
+ return ret;
}
static val h_do(match_line_ctx *c)
diff --git a/tests/008/call.expected b/tests/008/call.expected
new file mode 100644
index 00000000..f644dfc5
--- /dev/null
+++ b/tests/008/call.expected
@@ -0,0 +1,2 @@
+correct
+1
diff --git a/tests/008/call.txr b/tests/008/call.txr
new file mode 100644
index 00000000..0cbb39f6
--- /dev/null
+++ b/tests/008/call.txr
@@ -0,0 +1,13 @@
+@(next :list '("1"))
+@(define match1 (A))
+@ (all)
+1
+@ (and)
+@A
+@ (end)
+@(end)
+@(call 'match1 A)
+@(output)
+correct
+@A
+@(end)