lazy variables cannot be lvalues - why?
Stewart Gordon
smjg_1998 at yahoo.com
Mon Nov 1 10:13:14 PDT 2010
On 01/11/2010 15:57, Adam Cigánek wrote:
<snip>
> void capture(lazy void f) {
> fun =&f;
> }
<snip>
> It says "Error: lazy variables cannot be lvalues", pointing to the
> "fun =&f" line.
Because f doesn't have an address. It's just an expression that's
evaluated where it's used. It's true that the function in which the
compiler wraps f has an address, but that isn't the same.
> It can be worked around by rewriting it like this:
>
> void capture(lazy void f) {
> fun = delegate void() { f(); };
> }
>
> So it's not big deal, just a minor inconvenience. But still, why is it
> illegal? According to the docs
> (http://www.digitalmars.com/d/2.0/lazy-evaluation.html), lazy
> expressions are implicitly converted to delegates, so it seems to me
> that it should work.
This is inaccurate or at least badly worded. What's really meant is
that the compiler converts the lazy expression to a delegate.
Unfortunately, there's no way at the moment to extract that delegate,
though I do wish D explicitly supported & as a way of doing it.
There's a workaround: declaring the function instead as
void capture(void delegate()[1] f...)
which is the special case given on
http://www.digitalmars.com/d/1.0/function.html
under "Lazy Variadic Functions".
Stewart.
More information about the Digitalmars-d-learn
mailing list