Splitting a sequence into disjoint, fixed-length subsequences:

A virtual sequence for splitting a sequence into disjoint, fixed-length subsequences:

Splitting a sequence into overlapping, fixed-length subsequences:

Splitting a sequence into overlapping, fixed-length subsequences, wrapping around the end of the sequence:

A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences:

A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences, wrapping around the end of the sequence:

The difference can be summarized as the following:
 • With groups, the subsequences form the original sequence when concatenated:USING: grouping ; { 1 2 3 4 } 2 group .{ { 1 2 } { 3 4 } }USING: grouping ; { 1 2 3 4 } dup 2 concat sequence= .t • With clumps, collecting the first element of each subsequence but the last one, together with the last subsequence, yields the original sequence:USING: grouping ; { 1 2 3 4 } 2 clump .{ { 1 2 } { 2 3 } { 3 4 } }USING: grouping assocs sequences ; { 1 2 3 4 } dup 2 unclip-last [ keys ] dip append sequence= .t • With circular clumps, collecting the first element of each subsequence yields the original sequence. Collecting the nth element of each subsequence would rotate the original sequence n elements rightward:USING: grouping ; { 1 2 3 4 } 2 circular-clump .{ { 1 2 } { 2 3 } { 3 4 } { 4 1 } }USING: grouping assocs sequences ; { 1 2 3 4 } dup 2 keys sequence= .tUSING: grouping ; { 1 2 3 4 } 2 [ second ] { } map-as .{ 2 3 4 1 }

A combinator built using clumps:

Testing how elements are related: