map kinds of Ranges

foobar foo at bar.com
Wed May 25 11:03:11 PDT 2011


Andrei Alexandrescu Wrote:

> On 5/25/11 12:15 PM, Steven Schveighoffer wrote:
> > On Wed, 25 May 2011 12:19:03 -0400, Andrei Alexandrescu
> > <SeeWebsiteForEmail at erdani.org> wrote:
> >
> >> On 5/25/11 10:48 AM, Steven Schveighoffer wrote:
> >>> On Wed, 25 May 2011 11:45:30 -0400, Don <nospam at nospam.com> wrote:
> >>>
> >>>> Steven Schveighoffer wrote:
> >>>>> On Wed, 25 May 2011 10:59:46 -0400, Don <nospam at nospam.com> wrote:
> >>>>>
> >>>>>> Robert Clipsham wrote:
> >>>>>>> On 24/05/2011 04:28, Jonathan M Davis wrote:
> >>>>>>>>> Thoughts on this?
> >>>>>>>>
> >>>>>>>> I believe that the best and most likely to be implemented syntax
> >>>>>>>> which has
> >>>>>>>> been suggested (it was Andrei's idea IIRC) is to simply add
> >>>>>>>> optional clauses
> >>>>>>>> to attributes. So, instead of pure, you'd do pure(condition). If
> >>>>>>>> the condition
> >>>>>>>> is true, the templated function it's on is pure. If the condition
> >>>>>>>> is false,
> >>>>>>>> then the function isn't pure. Don't expect pure to become @pure or
> >>>>>>>> nothrow to
> >>>>>>>> become @nothrow though. I think that at this point, any attribute
> >>>>>>>> which is a
> >>>>>>>> keyword is going to stay one, and any attribute that has @ on the
> >>>>>>>> front of it
> >>>>>>>> is going to stay that way as well.
> >>>>>>>>
> >>>>>>>> - Jonathan M Davis
> >>>>>>> Wouldn't it make sense to follow the same syntax as auto ref? auto
> >>>>>>> pure, auto nothrow, auto @safe etc? (Although I guess that doesn't
> >>>>>>> allow for conditions, nevermind :<)
> >>>>>>
> >>>>>> 'auto ref' is one of worst syntax anomalies in the language. It
> >>>>>> should be a single keyword -- eg, 'autoref' -- it has nothing in
> >>>>>> common with the other use of 'auto', and it's not necessarily 'ref'.
> >>>>> The current implementation is incorrect. In a correct implementation
> >>>>> auto ref *is* always ref.
> >>>>> -Steve
> >>>>
> >>>> You're saying this example from the spec shouldn't compile?
> >>>>
> >>>> auto ref foo() { return 3; } // value return
> >>>
> >>> Yes. Auto ref is specifically to allow passing rvalues as references to
> >>> functions, not as a template that means either ref or not. At least,
> >>> that is my understanding from Andrei's description. I don't have a copy
> >>> of TDPL, but I think it's in there too.
> >>>
> >>> -Steve
> >>
> >> The example should work. "auto ref" means "ref if possible, otherwise
> >> drop it".
> >
> > Wait, I thought auto ref was to allow rvalues to be passed by reference?
> > I.e. given the function:
> >
> > void foo(auto ref S s)
> >
> > then you could call foo with an rvalue or an lvalue for s.
> >
> > I swear every time you have an opinion on auto ref it changes :(
> >
> > Or are there two different meanings depending on whether auto ref is a
> > parameter or return value attribute?
> >
> > -Steve
> 
> The same principle applies to your example: try ref if it works, 
> otherwise drop it.
> 
> 
> Andrei

I agree with pretty much everyone else on this. This is a horrible syntax which has nothing to do with neither 'auto' nor 'ref'. 

I propose instead: 

  void foo(drop it like it's hot ref S s);

where "drop it like it's hot" is a single lexer token.



More information about the Digitalmars-d mailing list