initializer for array of function literals

spir denis.spir at gmail.com
Sun Oct 31 03:32:37 PDT 2010


On Sat, 30 Oct 2010 23:13:18 -0400
bearophile <bearophileHUGS at lycos.com> 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



More information about the Digitalmars-d-learn mailing list