On Thu, Nov 2, 2017 at 9:28 PM, Andrew Glynn <aglynn42@gmail.com> wrote:

Perhaps #keepStateWhile or something similar might be better than #unchangedDuring ?


Something like "keepState" was also my first impression,��
but "During" seems to be the convention for restoring things after a code block completes.�� Are there methods breaking that convention?

cheers -ben

From: Prof. Andrew P. Black
Sent: Thursday, November 2, 2017 5:00 AM
To: Any question about pharo is welcome
Subject: [Pharo-users] Peeking at a stream

��

I sometimes find, when working with a stream, that I need to "peek ahead��� a few items, without disturbing the state of the stream. The message stream peek gives me the next item, but doesn���t generalize to multiple items, �� So I end up writing code like this:

��

�� �� findSomething

�������������������������� | savedPosition result |

�������������������������� savedPosition := stream position.
�������������������������� stream position: start.
�������������������������� ���code involving various manipulations of stream, including stream next"
�������������������������� result := stream position + 1.
�������������������������� stream position: savedPosition.

�������������������������� ^ result

��

This code involves at least two temps, is not very easy to read, and risks not resetting the stream properly if I do a return.

��

It seems to me that a better solution would be what Kent Beck calls an ���execute around��� method:

��

�� �� findSomething

�������������������������� ^��stream unchangedDuring: [ :s |

���������������������������������������������������� ���code involving various manipulations of stream, including stream next"

���������������������������������������������������� stream position + 1 ]

��

I���m not sure that I like the name #unchangedDuring:; perhaps you can think of a better one?��

��

The ��implementation of this would be

��

�������������������������� PositionableStream >> #unchangedDuring: aBlock

���������������������������������������������������� "execute aBlock with self as argument. Ensure that when this method returns,

���������������������������������������������������� I still have my current state."

����������������������������������������������������

���������������������������������������������������� | savedPosition |

���������������������������������������������������� savedPosition := self position.
�������������������������� �������������������������� ^��[ aBlock value: self ] ensure: [ self position: savedPosition ]

��

or perhaps

��

�������������������������� PositionableStream >> #unchangedDuring: aBlock
���������������������������������������������������� "execute aBlock with self as argument. Ensure that when this method returns,

���������������������������������������������������� I still have my current state."

����������������������������������������������������
���������������������������������������������������� ^��[��aBlock value: self copy ]

��

which might be better in the case that the stream is a file stream and aBlock causes the buffer to be refreshed from the disk.

��

  • Do other Smalltalks have a method like this? ��
  • Does it already exist in Pharo, somewhere that I���ve failed to look?��
  • Would it be a worthwhile addition to Pharo? ��
  • What would be a good name?

��

��

��

��