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.
WHOA können Sie sagen "Funktion" * und * sagen '=>' zur gleichen Zeit ?! Wusste das nicht! :) – Mehrdad
Ü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