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

Eliot Miranda eliot.miranda at gmail.com
Wed Apr 1 18:40:59 UTC 2020


On Wed, Apr 1, 2020 at 12:07 AM Marcel Taeumel <marcel.taeumel at hpi.de>
wrote:

> 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.
>

+1


>
> 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> 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> im
>> Auftrag von commits at source.squeak.org <commits at source.squeak.org>
>> *Gesendet:* Montag, 30. März 2020 12:51 Uhr
>> *An:* squeak-dev at lists.squeakfoundation.org;
>> 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
>>
>> ==================== 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
>
>
>

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


More information about the Squeak-dev mailing list