[Gambas-user] Swap expressions with side effects
Benoît Minisini
gambas at ...1...
Sat Jan 11 19:26:44 CET 2014
Le 11/01/2014 19:05, Tobias Boege a écrit :
> Hi,
>
> I just spent two good hours over my implementation of an algorithm to
> arrange some PointFs in an array so that the distance between P[i] and
> P[i+1] is the smallest possible among all points P[j], j > i. I don't
> want to bother you with details (well, I think I already did, sorry) but
> the comparison of two points is not only a function of these two points
> but also of some other reference point. So I used a line like this:
>
> Swap $aPoints[iInd + 1], $aPoints[GetNearest(iInd)]
>
> which means: get me the index of the nearest point to $aPoints[iInd] and
> swap $aPoints[iInd + 1] with the value there. This effectively sorts my
> array into the desired order (For iInd = 0 To $aPoints.Max - 1).
>
> Well, not really. Because Swap is not immune to side effects induced by
> the expressions to swap. The wiki states that implicitly by saying that
>
> Swap A, B
>
> is equivalent to
>
> tmp = A
> A = B
> B = tmp
>
> So my code really was:
>
> tmp = $aPoints[iInd + 1]
> $aPoints[iInd + 1] = $aPoints[GetNearest(iInd)]
> $aPoints[GetNearest(iInd)] = tmp
>
> which leads to an erroneous array because GetNearest() is a function of
> $aPoints[iInd + 1] which changed between the two invocations. [ The funny
> thing is that, due to the nature of GetNearest(), the result of the above
> three lines for all iInd is that the array remains unchanged. ]
>
> To cut a long story short, is this by design? Do you think it's worth
> changing that behaviour (it wouldn't break any sane use of Swap)? If not
> it's equivalently fine. I'll add a clear warning to the wiki, then.
>
> Regards,
> Tobi
>
As stated by the documentation, 'Swap' is just syntactic sugar for:
tmp = A
A = B
B = tmp
Each Swap expression will be evaluated twice (once as an expression, and
once as an assignment). It's like a C macro.
So I'm afraid it won't change!
--
Benoît Minisini
More information about the User
mailing list