This loop is a special case.
size := 10.
prevIndex := size. prevValue := seq at: prevIndex.
thisIndex := 1.    thisValue := seq at: thisIndex.
nextIndex := 2.    nextIndex := seq at: nextIndex.
[thisIndex <= size] whileTrue: [
  ...
  prevIndex := thisIndex. prevValue := thisValue.
  thisIndex := nextIndex. thisValue := nextValue.
  nextIndex := nextIndex = size
                 ifTrue:  [1]
                 ifFalse: [nextIndex + 1].
  nextValue := seq at: nextIndex].
Counting backwards is similar.


On Fri, 29 Mar 2019 at 04:44, James Foster <smallt...@jgfoster.net> wrote:

> One of my recent assignments to first-year programming students was to
> model Left-Center-Right (https://en.wikipedia.org/wiki/LCR_(dice_game)) where
> they needed to do just what you are trying to do.
>
> | size stream |
> size := 10.
> stream := WriteStream on: String new.
> 1 to: size do: [:i |
> stream
> print: i; tab;
> print: i \\ size + 1; tab;
> print: i + size - 2 \\ size + 1; tab;
> cr.
> ].
> stream contents
>
>
> On Mar 28, 2019, at 8:12 AM, Tim Mackinnon <tim@testit.works> wrote:
>
> Hey guys - I’m wondering if someone might have a nice way of selecting the
> previous value in a list - but wrapping around to the last value if you are
> at the front.
>
> Essentially I have an exercise with some values in a collection like:
>
> list :=  #($a $e $o $u).
>
> And I have an index into the list, and want to loop around from index 1,
> back to 4 when I hit the beginning of the list.
>
> While moving forwards is pretty easy with mod - e.g.
>
> ^list at: (index \\ list size + 1)
>
> I’m struggling with the cleanest way to do this backwards - as the
> following is unreadable to me (assuming index = 1)
>
> ^list at: (index - 2 \\ list size + 1)
>
> And then I tried (which isn't bad - but still not quite right).
>
> ^list before: (list at: index) ifAbsent: [ids last].
>
>
> I’m sure there is a better way to do this - but it’s alluding me?
>
> Tim
>
>
>
>
>
>

Reply via email to