2012-06-11 5 views
6

Ich habe mit D herumspielen, versuchen, Scala style curryable functions durch Verkettung Lambda Ausdrücke nachzuahmen.Erstellen curryable Funktionen mit Lambdas in D funktioniert nicht als Klasse Struct Memebers

kam ich mit auf den Punkt:

immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
struct S 
{ 
    static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
} 
class C  static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
} 

void main() 
{ 
    writefln("global\t%s",foo(1)(2)); 
    writefln("struct\t%s",S.foo(1)(2)); 
    writefln("class\t%s",C.foo(1)(2)); 
} 

Dies ist, was ich bekomme, wenn ich es laufen:

global 3 
struct 1528543170 
Segmentation fault 

Wie Sie sehen können, meine Methode funktioniert gut für die globale Funktion variabel, aber Die statische Funktionsvariable der Struktur gibt Junk-Ergebnis und die statische Funktionsvariable der Klasse schlägt vollständig fehl. Wenn ich die x aus dem Rückgabeausdruck entfernen - function(immutable int x)=>(immutable int y)=>(y) - die Struct-Version gibt das korrekte Ergebnis (2), aber die Klassenversion schlägt immer noch fehl.

Wenn ich eine reguläre Methode verwenden, anstatt eine Funktion Variable:

immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
struct S 
{ 
    static auto foo(immutable int x) 
    { 
     return (immutable int y)=>(x+y); 
    } 
} 
class C 
{ 
    static auto foo(immutable int x) 
    { 
     return (immutable int y)=>(x+y); 
    } 
} 

void main() 
{ 
    writefln("global\t%s",foo(1)(2)); 
    writefln("struct\t%s",S.foo(1)(2)); 
    writefln("class\t%s",C.foo(1)(2)); 
} 

es funktioniert gut:

global 3 
struct 3 
class 3 

Und ich bekomme auch den Vorteil, die Delegierten der Verwendung (der Compiler gewonnen‘ t Delegaten in der ersten Version erlauben) - aber dieser Stil ist weniger elegant.

Ich bin mir sehr wohl bewusst, dass D die curry Funktion in der std.functional Bibliothek für currying Funktionen haben, aber manchmal ist es bequemer, eine Funktion curryable standardmäßig zu machen, und neben - Ich bin neugierig zu wissen, warum meine erste Version ‚doesn t arbeiten.

Irgendwelche Ideen?

UPDATE

OK, I've filed a bug. Ich habe etwas mehr gegraben, und es stellt sich heraus, dass die Argumentliste von foo verschoben wird, und deshalb x Junk-Daten bekommt.

+0

WHOA können Sie sagen "Funktion" * und * sagen '=>' zur gleichen Zeit ?! Wusste das nicht! :) – Mehrdad

+0

Übrigens, hast du zufällig 'static __gshared' anstelle von' static' versucht? * Vielleicht * es wird funktionieren (Daumen drücken ... Ich habe keinen Compiler zur Hand) – Mehrdad

Antwort

4

Ehrlich, es sieht so aus, als ob Sie in einen Compiler-Fehler geraten sind. Please report it. Da die Variablen in der Struktur und der Klasse statisch sind, sollte ihr Verhalten mit dem der Variablen auf Modulebene identisch sein, und das ist eindeutig nicht der Fall.

+0

Es ist wirklich ein Compiler Bug. Ich habe es noch mehr eingeengt und gemeldet. –