delay instantiation errors on lists in phrase/3 until runtime (#1665, #2396)

This commit is contained in:
Mark Thom
2024-04-29 15:28:17 -06:00
parent bcfa0219e2
commit f3eea6302d

View File

@@ -246,6 +246,9 @@ seqq([Es|Ess]) --> seq(Es), seqq(Ess).
Cs0 = Cs. Cs0 = Cs.
... --> [] | [_], ... . ... --> [] | [_], ... .
% defer instantiation errors until runtime. instantiations may be made
% then.
error_goal(error(instantiation_error, _Context), _).
error_goal(error(E, must_be/2), error(E, must_be/2)). error_goal(error(E, must_be/2), error(E, must_be/2)).
error_goal(error(E, (=..)/2), error(E, (=..)/2)). error_goal(error(E, (=..)/2), error(E, (=..)/2)).
error_goal(error(representation_error(dcg_body), Context), error_goal(error(representation_error(dcg_body), Context),
@@ -259,7 +262,11 @@ user:goal_expansion(phrase(GRBody, S, S0), GRBody2) :-
E, E,
dcgs:error_goal(E, GRBody1) dcgs:error_goal(E, GRBody1)
), ),
( GRBody = (_:_) -> ( E = error(instantiation_error, _),
GRBody0 = [T|Ts] ->
GRBody2 = (error:must_be(list, [T|Ts]),
lists:append([T|Ts], S0, S))
; GRBody = (_:_) ->
GRBody2 = M:GRBody1 GRBody2 = M:GRBody1
; GRBody2 = GRBody1 ; GRBody2 = GRBody1
). ).