]> Repositorios git - scryer-prolog.git/commitdiff
ENHANCED: use '$skip_max_list'/4 for fast list tests in can_be/2 and must_be/2
authorMarkus Triska <[email protected]>
Fri, 26 Nov 2021 16:11:35 +0000 (17:11 +0100)
committerMarkus Triska <[email protected]>
Fri, 26 Nov 2021 16:11:35 +0000 (17:11 +0100)
This also (partially) addresses #1108.

src/lib/error.pl

index d6bf8708baf971a8f32601ee06808c0dbe514c48..749ad04ee989dd19f6976b77a7a7e1957070f035 100644 (file)
@@ -79,9 +79,12 @@ character(C) :-
         atom(C),
         atom_length(C, 1).
 
-ilist(V) :- var(V), instantiation_error(must_be/2).
-ilist([]).
-ilist([_|Ls]) :- ilist(Ls).
+ilist(Ls) :-
+        '$skip_max_list'(_, -1, Ls, Rs),
+        (   var(Rs) ->
+            instantiation_error(must_be/2)
+        ;   Rs == []
+        ).
 
 type(type).
 type(integer).
@@ -120,10 +123,11 @@ can_(chars, Ls)     :- '$is_partial_string'(Ls).
 can_(list, Term)    :- list_or_partial_list(Term).
 can_(boolean, Term) :- boolean(Term).
 
-list_or_partial_list(Var) :- var(Var).
-list_or_partial_list([]).
-list_or_partial_list([_|Ls]) :-
-        list_or_partial_list(Ls).
+list_or_partial_list(Ls) :-
+        '$skip_max_list'(_, -1, Ls, Rs),
+        (   var(Rs) -> true
+        ;   Rs == []
+        ).
 
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Shorthands for throwing ISO errors.