I would expect 1:0 to give me an empty sequence
because (a) for all other natural numbers n,
1:n gives me a sequence of n numbers, and (b)
how else am I supposed to get an empty sequence?
Under your interpretation, (x to: y) would never
be empty.

This has absolutely nothing to do with C.
As I commented, every programming language I
know except S uses a default increment of +1
in counted loops, if it allows default increments
at all.  Fortran, Algol 68, Pascal, PL/I, the
seq(1) command in Unix, Haskell, the `seq'
function in Erlang, between/3 in Prolog, OCaml,
F#, InterLISP-D, and so it goes.

Fortran is an interesting case, because Fortran 66
left DO label id = lower,upper
unspecified when lower > upper and several compilers
made such loops execute once, to the point where
programmer tended to think the standard required that,
but Fortran 77 nailed it down: NO iterations in that
case.

Here's a typical use of #to:do:
   s := 0.
   1 to: a size do: [:i |
     a at: i put: (s := (a at: i) + s)].
Why would you think it a good idea for this
to crash if the array is empty?

Smalltalk being Smalltalk, nothing stops you adding

  through: end do: aBlock
    self to: end by: (end < self ifTrue: [-1] ifFalse: [1])
                 do: aBlock.

to Integer if you really want to.

Oh, there's an ambiguity.  Should
5 through 1 mean 5,4,3,2,1 or 1,2,3,4,5?
Both can be argued for.


On Fri, 1 Mar 2019 at 02:03, Tim Mackinnon <tim@testit.works> wrote:

> Hi Richard - but why would you expect 1 to: 0 to give you an empty
> sequence?
>
> If I inspect “0 to: 1” I see:
> 1 -> 0
> 2 -> 1
>
> So I would expect “1 to: 0” to see:
> 1 -> 1
> 2 -> 0.
>
> I asked for a sequence going from 1 down to 0 (in my mind).  Knowing about
> all the by: -1 stuff seems very C’ish.
>
> Of course, I get that maybe it will break peoples existing code (and maybe
> that would be why it never gets changed) - but it still feels very strange.
> Or am I missing something?
>
> Tim
>
> On 28 Feb 2019, at 12:38, Richard O'Keefe <rao...@gmail.com> wrote:
>
> Of the couple of hundred programming languages I have
> used, there is precisely one that does what you expect
> (the S programming language, as implemented in R).
> And it is a major pain in the posterior with no upside
> that I can discern.
>
> Suppose I want a sequence of n consecutive integers
> beginning with 1.  In Smalltalk, (1 to: n) does the
> job.  In R, 1:n *almost* does the job.  But what
> happens when n = 0?  Smalltalk gives me the right
> answer: an empty sequence.  R gives me (1,0).  That
> means that *every* *flaming* *time* I write
> for (i in 1:n) {...}
> I have to take special care to ensure that n is not
> 0, sometimes even having to whack in an extra
> if (n > 0) for (i in 1:n) {...}
>
> Trawling through my Smalltalk code, I find that about
>  6.8% of my counted loops are by: -1,
>  0.7% of them are by: a negative number other than -1,
>  2.5% of them are by: a positive number other than 1,
> 90  % are just to:do: with no by:
> Inspecting some of the 90% showed that many of them
> would go catastrophically wrong if 1 to: 0 do:
> performed its body
>
> On Sat, 23 Feb 2019 at 03:58, Tim Mackinnon <tim@testit.works> wrote:
>
>> I've just been caught out with Intervals - why can't you do:
>> 5 to: 1 do: [ :i | Transcript show: i printString]  (eg a negative
>> interval)?
>>
>> if you want to iterate down a series of numbers do you really have to do:
>> 5 to: 1 by: -1 do: […
>>
>> I always assumed that if x > y the step was automatically -1 (but its
>> not).
>>
>> I asked on Discord - and someone pointed out that if you use variables it
>> could be ambiguous - but is it really? I don’t know if other smalltalks do
>> it this way (I vaguely recall Dolphin going down, but not sure).
>>
>> Either way the Interval comment should mention this - and I’ll correct it
>> when I get the wisdom of the crowd here.
>>
>> Tim
>>
>
>

Reply via email to