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).
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) :-
!,