On 9 November 2012 10:46, Jonathan M Davis <span dir="ltr"><<a href="mailto:jmdavisProg@gmx.com" target="_blank">jmdavisProg@gmx.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Friday, November 09, 2012 10:33:45 Manu wrote:<br>
> On 9 November 2012 00:44, Jonathan M Davis <<a href="mailto:jmdavisProg@gmx.com">jmdavisProg@gmx.com</a>> wrote:<br>
> > On Thursday, November 08, 2012 21:49:58 Manu wrote:<br>
> > > That's cute, but it really feels like a hack.<br>
> > > All of a sudden the debugger doesn't work properly anymore, you need to<br>
> > > step-in twice to enter the function, and it's particularly inefficient<br>
> > > in<br>
> > > debug builds (a point of great concern for my industry!).<br>
> > ><br>
> > > Please just with the compiler creating a temporary in the caller space.<br>
> > > Restrict is to const ref, or better, in ref (scope seems particularly<br>
> > > important here).<br>
> ><br>
> > I honestly wish that in didn't exist in the language. The fact that it<br>
> > it's an<br>
> > alias two different attributes is confusing, and people keep using it<br>
> > without<br>
> > realizing what they're getting into.<br>
><br>
> I understand it's an alias for 'const scope', but what's this about scope<br>
> not working correctly? What's wrong with it?<br>
> It seems like precisely what you want in this case... you don't want a<br>
> temporary escaping the function you pass it to.<br>
> What's the problem?<br>
<br>
</div>It only works with delegates. In all other cases, it's ignored.<br>
<div class="im"><br>
> If scope worked correctly, you'd only<br>
><br>
> > want it in specific circumstances, not in general. And since it doesn't<br>
> > work<br>
> > correctly aside from delegates, once it _does_ work correctly, it'll break<br>
> > code all over the place, because people keep using in, because they like<br>
> > how<br>
> > it corresponds with out or whatever.<br>
><br>
> I like how it promises that the thing I pass can't escape the callee, not<br>
> that it's the natural english compliment to 'out'.<br>
<br>
</div>There are cases where it's useful, but there are a ton of cases where it would<br>
be really annoying if it worked properly. For instance, in a _lot_ of cases,<br>
it would cause problems for a function taking an array, because it couldn't<br>
return a slice of the array.</blockquote><div><br></div><div>Does that actually make sense? Surely a function that receives a scope argument can return that argument, since it's only passing it back to the same function that already owns it... it knows it can trust that function, since it was received from that function.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Any struct holding any reference types would be<br>
in the same boat, as would any class or AA.<br></blockquote><div><br></div><div>I don't follow the problem with reference args. surely they can be evaluated just fine? Just that nothing can escape the function...</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In most cases, it really doesn't matter whether references escape, because the<br>
stuff is on the GC heap, and it'll collect it when it's appropriate. It would<br>
be a much bigger deal if you had to worry about ownership.<br></blockquote><div><br></div><div>It's true, and stack locals are perhaps the most important thing that scope could possibly protect... which makes it particularly applicable here.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">For delegates, it's great because it allows you to avoid allocating a closure,<br>
so if you don't need the delegate to escape, it makes perfect sense to make it<br>
scope. For everything else, whether it makes sense depends on what you're<br>
doing, and sometimes it would be useful, but most of the time, it really<br>
wouldn't be.<br></blockquote><div><br></div><div>Of course, and whether you apply the scope attribute to a function argument equally depends on what you're doing :)</div><div>I still can't see any inherent problems from what you're saying. It's still just an access restriction to enhance safety.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
But since in currently only works for delegates, it's absolutely pointless to<br>
use it instead of const for anything else, and if/when scope is ever fixed to<br>
work with reference types in general, then all kinds of code that uses in will<br>
break, because it'll be escaping references, and the programmer didn't notice<br>
it. So, you might as well just not use it at this point except for delegates.<br></blockquote><div><br></div><div>Very good point. I had no idea it didn't work. It'd be nice to see this fixed.</div><div><br></div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Regardless, you don't need in to use scope. You can just use scope directly.<br>
So, having in buys you _nothing_, and it unfortunately encourages people to<br>
use it (which IMHO is bad due to the issues with scope), because they like how<br>
it's the opposite of out.</blockquote><div><br></div><div>The issue here is that 'scope' is an incomplete feature. I think it's theoretically sound.</div><div>Every conversation/thing I've read on the topic certainly gave me the impression it worked...</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> So, if we didn't have in, we'd be able to do exactly<br>
what we can do now, but people wouldn't be using scope all over the place via<br>
in just because they liked the idea of in being the opposite of out.<br>
<br>
But originally, in comes from D1 (where it had a meaning similar to const<br>
IIRC, but scope had nothing to do with it), so it's been around for a long<br>
time, and there's pretty much no way that it would be removed from the<br>
language.</blockquote><div><br></div><div>Oh really? That's not at all what I had imagined. I presumed 'in' was invented when it was realised that 'const scope' was a super-common pattern.</div><div>I still don't see any less value in it. Just that it should work properly.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> I just think that it was mistake to have it given its current<br>
semantics. It's also a bit pointless IMHO to have an attribute which is an<br>
alias for other attributes. It's a needless duplication of functionality and<br>
just increases confusion.<br></blockquote><div><br></div><div>Side topic: what I find myself constantly wanting is alias for attributes!<br>Especially when dealing with GDC/LDC which have their own non-standard attributes. I'm often wanting to create a meaning alias for the set of attributes applicable to my code.</div>
<div>And you can't currently use GDC attributes without static if and physically duplicating all the attributed code >_<</div></div></div>