emit callable type errors from call/1 and phrase/3 when appropriate (#2202)
This commit is contained in:
@@ -101,7 +101,10 @@ dcg_rule(( NonTerminal --> GRBody ), ( Head :- Body )) :-
|
|||||||
dcg_non_terminal(NonTerminal, S0, S, Goal) :-
|
dcg_non_terminal(NonTerminal, S0, S, Goal) :-
|
||||||
NonTerminal =.. NonTerminalUniv,
|
NonTerminal =.. NonTerminalUniv,
|
||||||
append(NonTerminalUniv, [S0, S], GoalUniv),
|
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) :-
|
dcg_terminals(Terminals, S0, S, S0 = List) :-
|
||||||
append(Terminals, S, List).
|
append(Terminals, S, List).
|
||||||
|
|||||||
@@ -231,14 +231,17 @@ complete_partial_goal(N, HeadArg, InnerHeadArgs, SuppArgs, CompleteHeadArg) :-
|
|||||||
integer(N),
|
integer(N),
|
||||||
N >= 0,
|
N >= 0,
|
||||||
HeadArg =.. [Functor | InnerHeadArgs],
|
HeadArg =.. [Functor | InnerHeadArgs],
|
||||||
% the next two lines are equivalent to length(SuppArgs, N) but
|
( callable(Functor) ->
|
||||||
% avoid length/2 so that copy_term/3 (which is invoked by
|
% the next two lines are equivalent to length(SuppArgs, N) but
|
||||||
% length/2) can be bootstrapped without self-reference.
|
% avoid length/2 so that copy_term/3 (which is invoked by
|
||||||
functor(SuppArgsFunctor, '.', N),
|
% length/2) can be bootstrapped without self-reference.
|
||||||
SuppArgsFunctor =.. [_ | SuppArgs],
|
functor(SuppArgsFunctor, '.', N),
|
||||||
% length(SuppArgs, N),
|
SuppArgsFunctor =.. [_ | SuppArgs],
|
||||||
append(InnerHeadArgs, SuppArgs, InnerHeadArgs0),
|
% length(SuppArgs, N),
|
||||||
CompleteHeadArg =.. [Functor | InnerHeadArgs0].
|
append(InnerHeadArgs, SuppArgs, InnerHeadArgs0),
|
||||||
|
CompleteHeadArg =.. [Functor | InnerHeadArgs0]
|
||||||
|
; type_error(callable, Functor, _)
|
||||||
|
).
|
||||||
|
|
||||||
inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
|
inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
|
||||||
!,
|
!,
|
||||||
|
|||||||
Reference in New Issue
Block a user