On Sat, 30 Oct 2010 23:13:18 -0400
bearophile <[email protected]> wrote:
> Adrian Matoga:
>
> > I would appreciate if somebody explained to me why this code:
> >
> > static void function(int a)[] foo = [ function (int a) { } ];
> >
> > causes the following compile error:
> >
> > test.d(2): Error: non-constant expression __funcliteral1
>
> When you ask for questions like these, please if possible show a complete
> compilable program that includes a main().
>
> This doesn't compile:
>
> static void function(int a)[] foo = [function (int a) {}];
> void main() {}
>
>
> This works, but I don't know/remember what's the difference:
>
> void f1(int a) {}
> static void function(int a)[] foo = [&f1];
> void main() {}
(Note: no need to name parameters in func types.)
Upon func literals, to, I don't understand why this doesn't compile:
int hof(int function(int i) f , int i) {return f(i) ;}
void main () {
writeln( hof((int i) {return ++i ;} , 1) );
}
Element.d(15): Error: function Element.hof (int function(int i) mapFunc, int i)
is not callable using argument types (int delegate(int i),int)
Element.d(15): Error: cannot implicitly convert expression (__dgliteral1) of
type int delegate(int i) to int function(int i)
According to "the D programming language", D is supposed to construct a
function when the definition does not use any variable of its environment
(read: if the closure holds no upvalue); as opposed a so-called delegate (*).
In this case, it's clear that "(int i) {return ++i ;}" does not close over
anything, isn't it? So why does D construct a delegate anyway?
Also, I think D should not annoy us with the func/delegate distinction -- which
is only for saving space -- and accept func defs that match the given type
signature. The annoying distinction is semantically irrelevant; the signature
is relevant.
Denis
(*) By the way, why does D call closures "delegates"? I find this very
misleading, since delegation already has some meaning in the context of
programming. And well, "closure" is well established precisely in this sense.
Sometimes, PL designers amaze me ;-)
-- -- -- -- -- -- --
vit esse estrany ☣
spir.wikidot.com