On 22 September 2014 19:22, via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
> On Sunday, 21 September 2014 at 11:37:19 UTC, Manu via Digitalmars-d wrote: > >> On 21 September 2014 16:02, deadalnix via Digitalmars-d < >> digitalmars-d@puremagic.com> wrote: >> >> On Sunday, 21 September 2014 at 03:48:36 UTC, Walter Bright wrote: >>> >>> On 9/12/2014 6:48 PM, Manu via Digitalmars-d wrote: >>>> >>>> What happens when a scope() thing finds it's way into generic code? If >>>>> the type >>>>> doesn't carry that information, then you end up in a situation like >>>>> ref. >>>>> Have >>>>> you ever had to wrestle with ref in generic code? >>>>> ref is the biggest disaster zone in D, and I think all it's problems >>>>> will >>>>> translate straight to scope if you do this. >>>>> >>>>> >>>> I'm unaware of this disaster zone. >>>> >>>> >>> Well it is very real. I had to duplicate bunch of code in my visitor >>> generator recently because of it. Getting generic code ref correct is >>> very >>> tedious, error prone, and guarantees code duplication and/or various >>> static >>> ifs all over the place. >>> >>> >> It's also extremely hard to unittest; explodes the number of static if >> paths exponentially. I'm constantly finding bugs appear a year after >> writing some code because I missed some static branch paths when >> originally >> authoring. >> > > If I understand you right, your problems come from the fact that sometimes > in a template you want ref, and sometimes you don't. > > But I think this mostly doesn't apply to scope: either you borrow things, > or you don't. In particular, when you do borrow something, you're not > interested in the owner your parameter has inside the caller, you just take > it by scope (narrowing the lifetime). Thus there needs to be no information > about it inside the callee, and you don't need different instantiations > depending on it. > > One special case where scope deduction might be desirable are template > functions that apply predicates (delegates, lambdas) to passed-in > parameters, like map and filter. For these, the scope-ness of the input > range can depend on whether the predicates are able to take their > parameters as scope. > Application to scope will be identical to ref. A function that returns or receives scope that is inserted into generic code must have that property cascaded outwards appropriately. If typeof() or alias loses 'scope', then it will all go tits-up.