Another, more cross dialect variant, is to remember that intervals are collections too (I find this more functional as well).
| sequence |
sequence = #('I' 'invented' 'the' 'term' 'Object' 'Oriented' 'Programming' 'and' 'this' 'is' 'not' 'it').
(1 to: sequence size by: 2) collect: [:n | sequence at: n]
will return:
#('I' 'the' 'Object' 'Programming' 'this' 'not')
But can be easily changed to return
#('invented' 'term' 'Oriented' 'and' 'is' 'it')
by simply swapping the leading 1
for a 2
. What's nice though, is that you can slice it any way you want. If your dialect has a pairsCollect:, you can only use it for adjacent items. You can't get every third word starting two from the back in backwards order:
(sequence size - 1 to: 1 by: -3) collect: [:n | sequence at: n]
"returns"
#('not' 'and' 'Object' 'invented')
I find that using the sequence as a slice iterator to collect:
is a far more useful and general pattern to use.