[m-rev.] for review: make split_list/4, drop/3 and take/3 consistent.
Julien Fischer
jfischer at opturion.com
Sat Jun 4 23:00:08 AEST 2016
On Sat, 4 Jun 2016, Mark Brown wrote:
> On Sat, Jun 4, 2016 at 5:15 PM, Julien Fischer <jfischer at opturion.com> wrote:
>>
>> For review by anyone.
>>
>> -----------------------------------------------------------------------
>
>> diff --git a/library/list.m b/library/list.m
>> index 4a18bcc..9c33899 100644
>> --- a/library/list.m
>> +++ b/library/list.m
>> @@ -206,34 +206,35 @@
>> :- pred same_length3(list(T1)::in, list(T2)::in, list(T3)::in)
>> is semidet.
>>
>> - % split_list(Len, List, Start, End):
>> + % split_list(N, List, Start, End):
>> %
>> - % splits `List' into a prefix `Start' of length `Len', and a remainder
>> - % `End'. See also: take, drop and split_upto.
>> + % splits `List' into a prefix `Start' of length `N', and a remainder
>> + % `End'. Fails if `N' is not in 0 .. length(List).
>> + % See also: take, drop and split_upto.
>
> I feel there should be some quotes around that last occurrence of
> List.
Done.
> Or perhaps just leave out the quotes entirely, as more recent
> parts of the documentation tend to do?
There's a lack of consistency as to whether we quote things in the
library documentation (among many things). In the absence of the coding
guidlines saying anything on the matter, I just went for local
consistency.
>> %
>> :- pred split_list(int::in, list(T)::in, list(T)::out, list(T)::out)
>> is semidet.
>>
>> - % det_split_list(Len, List, Start, End):
>> + % det_split_list(N, List, Start, End):
>> %
>> % A deterministic version of split_list, which aborts instead
>> - % of failing if Len > length(List).
>> + % of failing if `N' is not in 0 .. length(List).
>> %
>> :- pred det_split_list(int::in, list(T)::in, list(T)::out, list(T)::out)
>> is det.
>>
>> - % split_upto(Len, List, Start, End):
>> + % split_upto(N, List, Start, End):
>> %
>> - % splits `List' into a prefix `Start' of length `min(Len,
>> length(List))',
>> + % splits `List' into a prefix `Start' of length `min(N, length(List))',
>
> This comment should also account for the N < 0 case. (I presume people
> are happy with {split,take}_upto keeping their existing semantics.)
I'll look at this separately; we also don't have test coverage of it.
>
>> @@ -2411,6 +2392,24 @@ take_while(P, [X | Xs], Start) :-
>> take_while(P, Xs) = Start :-
>> take_while(P, Xs, Start).
>>
>> +%---------------------------------------------------------------------------%
>> +
>> +drop(N, Xs, FinalXs) :-
>> + ( if N > 0 then
>> + Xs = [_ | Tail],
>> + list.drop(N - 1, Tail, FinalXs)
>> + else
>> + N = 0,
>> + FinalXs = Xs
>> + ).
>> +
>> +det_drop(N, Xs, FinalXs) :-
>> + ( if list.drop(N, Xs, FinalXsPrime) then
>> + FinalXs = FinalXsPrime
>> + else
>> + unexpected($file, $pred, "index out of range")
>> + ).
>> +
>> drop_while(_, [], []).
>> drop_while(P, [X | Xs], End) :-
>> ( if P(X) then
>
> I think this block of code should stay where it was. The code is
> better separated based on whether it is index-based or higher-order,
> rather than whether it is take or drop, in particular because only the
> former deals with negative indexes. (So, for example, as part of this
> review I looked at all of the existing index-based code as a whole,
> but didn't need to look at the higher-order code. It was useful that
> the code I wanted to look at was grouped together.)
Done.
Julien.
More information about the reviews
mailing list