What about the semantics here?

alias MapTile tile=map[y*w+x];
x++;
tile.id=something;

Personally I'd find 'ref' more intuitive since it doesn't have that question. Not that I'd object to alias ALSO being supported.

I'm probably not actually going to change any of those variables in my case, so if I had to use alias, I'd just want to be sure that the common subexpression elimination can pick it up. (My case is actually 3D fwiw.)

Note that this is already supported (apologies if I've got the syntax slightly wrong):

foreach (i, ref tile; map) { ... }

That's a local variable too. It could have instead been defined such that "tile" is an alias for "map[i]", but that would be a little strange.

On 11/01/2012 08:18, Gor Gyolchanyan wrote:
I think that would introduce a big potential for bugs. Can't give you
an example, but I have a hunch :-)

I think alias is better, since ref doesn't change its target and thus
need not be evaluated at run-time. In fact, I think alias should work
for any sort of expression. In this case one of D's mottos will be
"Too big? Alias it!".

On Wed, Jan 11, 2012 at 8:16 AM, Robert Jacques<[email protected]>  wrote:
On Tue, 10 Jan 2012 21:55:53 -0600, Nick Sabalausky<[email protected]>  wrote:

"Ben Davis"<[email protected]>  wrote in message
news:[email protected]...

Hi,

Please excuse the cross-post with D.learn. People have been helpful there
with workarounds, but I'm bringing it here in the hope that we can
discuss
a language enhancement.

So - could support for 'ref' local variables be added, or is there a
reason not to? I want to write something like:

MapTile[] map;    // It's a struct

ref MapTile tile=map[y*w+x];
tile.id=something;
tile.isWall=true;
someFunctionThatTakesRefMapTile(tile);


I *really* want the ability to do that sort of thing, although I think it
should be an alias rather than a ref variable:

MapTile[] map;    // It's a struct

alias map[y*w+x] tile;
tile.id=something;
tile.isWall=true;
someFunctionThatTakesRefMapTile(tile);


Would making pointers implicitly convert to ref parameters suffice? i.e.
make

    void foo(ref int x) { x++; }

    int x = 5;
    auto y =&x;
    foo(y);

valid D code?




Reply via email to