動的クロージャ

よくわからない挙動を…うーん。

import std.c.stdio;

int delegate() dg;

void f(int x){
    int foo() { return x; }
    dg = &foo;
}

void curry(int y){
    int x = dg();
    printf("x + y = %d\n", x + y);
}

void main(){
    f(1);
    curry(2);
}

出力

x + y = 4

おいまてそれはねえ、という感じである。
ためしにxとyが幾つになってるか調べて見ると…?

import std.c.stdio;

int delegate() dg;

void f(int x){
    int foo() { return x; }
    dg = &foo;
}

void curry(int y){
    int x = dg();
    printf("x = %d\n", x); // 追加
    printf("y = %d\n", y); // 追加
    printf("x + y = %d\n", x + y);
}

void main(){
    f(1);
    curry(2);
}

結果。

x = 1
y = 2
x + y = 3

おいま(略)、という感じである。
ボクがdelegateの使い方を致命的なレベルで間違っているんだろうか。でも何処がおかしいのかよくわからない。