]> Repositorios git - scryer-prolog.git/commitdiff
emit callable type errors from call/1 and phrase/3 when appropriate (#2202)
authorMark <[email protected]>
Mon, 4 Dec 2023 19:20:14 +0000 (12:20 -0700)
committerMark <[email protected]>
Mon, 4 Dec 2023 19:20:14 +0000 (12:20 -0700)
src/lib/dcgs.pl
src/loader.pl

index 1767d2bb0177581740763006609520dee762ab70..b8563151d65af096f901023983b2ec576c3e668a 100644 (file)
@@ -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).
index d1b718b07709e2566b5cc40105b07b4aa044e269..18b04abf2c007fd67d1921071bfa2537f851abb1 100644 (file)
@@ -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) :-
     !,