From 2c76943d35d73f86357fa2339689cb6162811ec2 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 4 Dec 2023 12:20:14 -0700 Subject: [PATCH] emit callable type errors from call/1 and phrase/3 when appropriate (#2202) --- src/lib/dcgs.pl | 5 ++++- src/loader.pl | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/lib/dcgs.pl b/src/lib/dcgs.pl index 1767d2bb..b8563151 100644 --- a/src/lib/dcgs.pl +++ b/src/lib/dcgs.pl @@ -101,7 +101,10 @@ dcg_rule(( NonTerminal --> GRBody ), ( Head :- Body )) :- dcg_non_terminal(NonTerminal, S0, S, Goal) :- NonTerminal =.. NonTerminalUniv, append(NonTerminalUniv, [S0, S], GoalUniv), - Goal =.. GoalUniv. + ( callable(NonTerminal) -> + Goal =.. GoalUniv + ; Goal = NonTerminal % let call/N throw an error instead of throwing one here. + ). dcg_terminals(Terminals, S0, S, S0 = List) :- append(Terminals, S, List). diff --git a/src/loader.pl b/src/loader.pl index d1b718b0..18b04abf 100644 --- a/src/loader.pl +++ b/src/loader.pl @@ -231,14 +231,17 @@ complete_partial_goal(N, HeadArg, InnerHeadArgs, SuppArgs, CompleteHeadArg) :- integer(N), N >= 0, HeadArg =.. [Functor | InnerHeadArgs], - % the next two lines are equivalent to length(SuppArgs, N) but - % avoid length/2 so that copy_term/3 (which is invoked by - % length/2) can be bootstrapped without self-reference. - functor(SuppArgsFunctor, '.', N), - SuppArgsFunctor =.. [_ | SuppArgs], - % length(SuppArgs, N), - append(InnerHeadArgs, SuppArgs, InnerHeadArgs0), - CompleteHeadArg =.. [Functor | InnerHeadArgs0]. + ( callable(Functor) -> + % the next two lines are equivalent to length(SuppArgs, N) but + % avoid length/2 so that copy_term/3 (which is invoked by + % length/2) can be bootstrapped without self-reference. + functor(SuppArgsFunctor, '.', N), + SuppArgsFunctor =.. [_ | SuppArgs], + % length(SuppArgs, N), + append(InnerHeadArgs, SuppArgs, InnerHeadArgs0), + CompleteHeadArg =.. [Functor | InnerHeadArgs0] + ; type_error(callable, Functor, _) + ). inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :- !, -- 2.54.0