On Thursday, 15 March 2012 at 17:05:00 UTC, Andrei Alexandrescu wrote:
On 3/15/12 11:30 AM, Manu wrote:
On 15 March 2012 17:32, Andrei Alexandrescu
<seewebsiteforem...@erdani.org <mailto:seewebsiteforem...@erdani.org>>
wrote:
One note - the code is really ingenious, but I still prefer swap() in this case. It's more concise and does less work in the general case.

   swap(a[i + k], a[j + j]);

   only computes the indexing once (in source, too).


It all still feels to me like a generally ugly hack around the original
example:
  a,b = b,a;

It's a function call. Why is a function call a ugly hack?

It's also more verbose. Compare

swap(a[i + k], a[i + j]);

with

a[i + k], a[i + j] = a[i + j], a[i + k];

I mean one could even easily miss a typo in there.

There's also semantic issues to be defined. What is the order of evaluation in

f(), g() = h(), k();

?

All of this adds dead weight to the language. We shouldn't reach to new syntax for every single little thing.


Andrei

even if swap is preferable here (IMO the syntax improvement here is negligible) it is still a special case. In the general case Ruby allows e.g:
a, b, c, d = b, d, a, c

How would you do this with swap?

The order of evaluation is an orthogonal issue to the syntax.
The compiler calculates n functions to produce n values so we could leave the order undefined.

Some FP languages define order of evaluation (e.g. left to right) but IMO this is more suitable for older PCs with serial execution (single processor). It's worth considering for current and future multi/many-core PCs to instead evaluate the tuple concurrently. or perhaps provide both options, e.g.
f(), g() // left to right
@parallel f(), g() // separate tasks/threads

Or perhaps even switch the default to make the parallel order the default and mark the former with a @serial annotation.

Reply via email to