[squeak-dev] #doWhileTrue: (was: The Trunk: System-nice.1149.mcz)

Marcel Taeumel marcel.taeumel at hpi.de
Wed Apr 1 07:07:33 UTC 2020


Hi all!

Yes, #doWhileTrue: does not improve readability compared to #whileTrue and #whileTrue:. Either way, you have to understand that the last statement in a block is its returned value.

I personally don't like it because "do" kind of means enumerating a collection. :-) And do-it! Ha! ;-)

Let's follow that thought ... so, #doWhileTrue: becomes #do:whileTrue:

#(1 2 3 4) do: [:ea | Transcript showln: ea] whileTrue: [:ea | ea < 3].

That is already possible with #select:, #reject:, or maybe #detect::

#(1 2 3 4) select: [:ea | ea < 3] thenDo: [:ea | Transcript showln: ea].
(#(1 2 3 4) select: [:ea | ea < 3]) do: [:ea | Transcript showln: ea].

#(1 2 3 4) detect: [:ea | Transcript showln: ea. ea >= 3] ifNone: [].


... Funny. And out of topic here. :-) There is no need for #doWhileTrue:. We should deprecate it.

Best,
Marcel
Am 01.04.2020 02:27:11 schrieb Eliot Miranda <eliot.miranda at gmail.com>:
Hi Christoph,

On Mon, Mar 30, 2020 at 10:58 AM Thiede, Christoph <Christoph.Thiede at student.hpi.uni-potsdam.de [mailto:Christoph.Thiede at student.hpi.uni-potsdam.de]> wrote:

Hi Nicolas,

> There is no other sender of doWhileFalse: doWhileTrue: and my advice would be to deprecate them. YAGNI.

So my image actually contains around two dozen senders of #doWhileTrue: and #doWhileFalse: (Squot, Pheno and some of my own code). As mentioned somewhere else in the past, I actually like them and find them very useful.

In my opinion, many senders of #whileTrue and #whileFalse should be refactored to use #doWhileTrue:/#doWhileFalse:. Here is a random example:

[newPlace := self getNewPlace.
dir := ServerFile new fullPath: newPlace.
(dir includesKey: dir fileName)] whileTrue.

I find that's ugly and counter-intuitive! I would rewrite this in the following way:

[newPlace := self getNewPlace.
dir := ServerFile new fullPath: newPlace]
    doWhileTrue: [dir includesKey: dir fileName].

Ugh, horrible.  The whileTrue is Smalltalk.  doWhilerye: is some kind of attempt to do C.  I have to say that I *hate* diWhileTrue:.  whileTrue is beautifully elegant.  You'll find it natural if you try and leave behind the damage from more conventional control-flow ischemes.

 

The latter just reads easier. blockReturns in multi-statement blocks are not really intuitive.
In the first version, when scanning the method quickly, I read "okay, something with places and directories is done, while true ...," I wonder "what has to be true?" and have to look back to the end of the block and find the beginning of the last statement.
But in the second version, I read "okay, something with places and directories is done, while that directory matches this specific condition." This version directly draws my attention to the important condition.

Happy to hear your counterarguments :-)

Two blocks where one will do?  Unnecessary.  Blocks are objects and understand messages, so whileTrue is coherent with the rest of the system, more concise, and indeed to my eyes much more elegant.
 

Best,
Christoph


Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org [mailto:squeak-dev-bounces at lists.squeakfoundation.org]> im Auftrag von commits at source.squeak.org [mailto:commits at source.squeak.org] <commits at source.squeak.org [mailto:commits at source.squeak.org]>
Gesendet: Montag, 30. März 2020 12:51 Uhr
An: squeak-dev at lists.squeakfoundation.org [mailto:squeak-dev at lists.squeakfoundation.org]; packages at lists.squeakfoundation.org [mailto:packages at lists.squeakfoundation.org]
Betreff: [squeak-dev] The Trunk: System-nice.1149.mcz
 
Nicolas Cellier uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-nice.1149.mcz [http://source.squeak.org/trunk/System-nice.1149.mcz]

==================== Summary ====================

Name: System-nice.1149
Author: nice
Time: 30 March 2020, 12:50:26.196366 pm
UUID: ece53b0b-24d2-4d4b-bc91-6794a661f886
Ancestors: System-ul.1148

avoid neuron storming [...] doWhileTrue: true, it just means [...] repeat

There is no other sender of doWhileFalse: doWhileTrue: and my advice would be to deprecate them. YAGNI.

=============== Diff against System-ul.1148 ===============

Item was changed:
  ----- Method: MOFile>>searchByHash: (in category 'experimental') -----
  searchByHash: aString
         | hashValue nstr index incr key |
         hashValue :=  self hashPjw: aString.
         incr := 1 + (hashValue \\ (hashTableSize -2)).
         index := (hashValue \\ hashTableSize) .
         [        nstr := (hashTable at: index +1 ).
                 nstr = 0 ifTrue: [^nil].
                 key := self originalString: nstr.
                 key = aString ifTrue: [^self translatedString: nstr].
                 index >= (hashTableSize - incr)
                                 ifTrue: [index := index - (hashTableSize - incr)  ]
                                 ifFalse:[index := index + incr].       
+        ] repeat!
-        ] doWhileTrue: true.!






--

_,,,^..^,,,_

best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200401/24381724/attachment.html>


More information about the Squeak-dev mailing list