Example of Rust code
Marco Leise
Marco.Leise at gmx.de
Sun Aug 12 00:06:06 PDT 2012
Am Sun, 12 Aug 2012 00:17:44 +0200
schrieb Timon Gehr <timon.gehr at gmx.ch>:
> On 08/11/2012 01:24 PM, Marco Leise wrote:
> > Am Fri, 10 Aug 2012 15:56:53 +0200
> > schrieb Timon Gehr<timon.gehr at gmx.ch>:
> >
> >> int eval(scope Expr* e){
> >> final switch(e.tag) with(Expr.Tag){
> >> case val: return e.i;
> >> case plus: return eval(e.a) + eval(e.b);
> >> case minus: return eval(e.a) - eval(e.b);
> >> }
> >> }
> >
> > Can you quickly explain the use of scope here?
> > Does that mean "I wont keep a reference to e"?
>
> It means "I won't keep a reference to *e", but I assume that is what
> was meant.
>
> > What are the implications?
>
> The caller has some confidence that passing a pointer to stack-
> allocated data is safe.
>
> > Does scope change the method signature?
>
> Yes. It is eg. impossible to override a method that has a scope
> parameter with a method that does not have a scope parameter.
>
> > Does the compiler enforce something?
>
> In this case and currently, it is merely documentation.
> I think it should be enforced and cast(scope) should be added
> to allow non- at safe code to escape the conservative analysis.
>
> > Will generated code differ?
>
> Only the mangled symbol name will differ. (unlike when scope is used on
> delegate parameters, in this case it prevents closure allocation at the
> call site.)
>
> > Does it prevent bugs or is it documentation for the user of the function?
>
> It is just documentation, both for the user and the maintainer.
>
> > Thanks in advance for some insight!
> >
Now that looks like a good 'scope' FAQ. thx
--
Marco
More information about the Digitalmars-d
mailing list