On Mon, 21 Sep 2009 14:28:09 -0400, Jeremie Pelletier <jerem...@gmail.com> wrote:

Steven Schveighoffer wrote:
On Mon, 21 Sep 2009 12:23:46 -0400, Jeremie Pelletier <jerem...@gmail.com> wrote:

'in' means 'const scope' in D2, which is using pass-by-value semantics.
Yes, you are right. I can't see the benefit to it, so I guess my recommendation is not to ever use in (use const instead).

I disagree, I have different uses for both. I use 'in' when the reference will not leave the function's scope and const when it does. Both are immutable views on the data but with different usage semantics. The different semantics aren't yet implemented in D2 but they are most useful to determine whether I can, for example, decide whether to send a slice (to in parameters) or a copy (to const parameters).

Yes, that would be useful if it was enforced. But it's not, so it's not useful. Unless you trust the compiler in your head :)

I myself stay out of 'ref' and 'out' params since they do not yet optimize and add quite a lot of overhead making temporary "safe" copies of the data.
I understand the problem behind not optimizing (inline), but I'm not sure what you mean by making temporary "safe" copies.

Right now the compiler makes a temporary copy of referenced parameters on the stack, calls the function with a pointer to the stack copy, and once the function returns copies the modified temporary back to its original location. This is quite considerable overhead.

Are you sure this is true? I don't have a d2 compiler right now, but that sounds like a *huge* step in the wrong direction. D1 does not do this (tested dmd 1.046).


Also 'scope' params have a meaning, when a delegate parameter is declared as scope, it allows a closure to use stack storage instead of the usual heap storage.
yes, but in the context of an 'in' parameter, most of the time you are not passing a delegate using in, so scope doesn't mean much there.

The implied 'scope' in 'in' has no effect yet due to a current compiler bug. You have to explicitly use 'scope' when declaring delegate parameters. Just like the 'in' vs 'const' have different semantics, 'in' vs plain 'scope' also have different semantics, which should get fixed soon.

Yes, I understand the reasoning for scope delegates.  My point was that
1. scope for non-delegate parameters is currently a noop
2. const does not make any sense for a delegate.

So arguing that the 'scope' part of 'in' is useful for delegates is currently a moot point. I guess you could use it as a quicker way to type scope or const, but it currently doesn't have any different use than just typing 'scope' (for delegates) or 'const' (for other types).


For example, consider the following:

void Foo(scope delegate() bar) { bar(); }
void Foo2(delegate() bar) { bar(); }

// This method uses stack storage, the implied scope in 'in' should also work here, but is bugged right now so explicit 'scope' is needed
void Test() {
     void Bar() {}
     Foo(&Bar);
}

// This method uses heap storage allocated on the GC through _d_allocmemory
// Notice how the only difference is the 'scope' qualifier of Foo2()
void Test2() {
     void Bar() {}
     Foo2(&Bar);
}

it's still incomplete. For example, this still allocates a closure on the heap:

void Bar() {}
auto x = &Bar;
Foo2(x);

I think scope will have to become a type-modifier before it is a complete solution.

-Steve

Reply via email to