]> Repositorios git - scryer-prolog.git/commitdiff
delay instantiation errors on lists in phrase/3 until runtime (#1665, #2396)
authorMark Thom <[email protected]>
Mon, 29 Apr 2024 21:28:17 +0000 (15:28 -0600)
committerMark Thom <[email protected]>
Mon, 29 Apr 2024 21:28:17 +0000 (15:28 -0600)
src/lib/dcgs.pl

index 787f2babaf492462164bffd7b0b432940ddc78ba..200e57a8e8205ca98c2bc14673f21bc79e9711f0 100644 (file)
@@ -246,6 +246,9 @@ seqq([Es|Ess]) --> seq(Es), seqq(Ess).
    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, (=..)/2), error(E, (=..)/2)).
 error_goal(error(representation_error(dcg_body), Context),
@@ -259,7 +262,11 @@ user:goal_expansion(phrase(GRBody, S, S0), GRBody2) :-
           E,
           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 = GRBody1
     ).