Ich hoffe euch allen gut. Ich implementiere den Fixpunkt Y-Kombinator in Harbor und ich habe einige Probleme damit. Nun, der Y-Combinator durch das Lambda-Kalkül wie folgt definiert werden:Zugriff auf äußere Variable in einem Block und Y-Kombinator
Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x)))
Ich versuche memoization mit Y-Combinator von Performance Fragen anzuwenden. Meine aktuelle Implementierung ist:
Function YMem(bF, aCache)
Local xAnswer
If !lCache ; lCache := { } ; EndIf
Return { |Arg| Iif(aCache[ Arg ] ;
, /* then */ aCache[ Arg ];
, /* otherwise */ aCache[ Arg ] := ;
Eval(Eval(bF, { |N| Eval(Eval(YMem, bF, aCache), N) }), Arg)) }
Grundsätzlich kann ich keine Aussagen innerhalb von Blöcken verwenden, aber ich kann Ausdrücke verwenden und es funktioniert gut. Ich vermeide eine unendliche Rekursion und die Grenze, die von 0 nach unendlich geht.
Bis zu dieser Zeit kompiliert es gut, aber wenn ich versuche, auf eine Variable eines äußeren Blocks zuzugreifen, tritt Harbor mich in Gesicht!
die Y-Combinator Implementierung zu testen, ich versuche, eine einfache Implementierung von Fibonacci-Sequenz anwenden, aber wenn ich einen Block zurück, die einen Parameter G
und implizit gibt einen Block, der einen Parameter für mich nicht verfügbar N
, G
becames erhält erhält und der Compiler sagt mir, dass "Äußere Codeblock-Variable nicht erreichbar ist".
Function Main
Local bFib := YMem({ |G| ;
{ |N| ;
Iif(N == 0, 1, Iif(N == 1, 1, Eval(G, N - 1) + Eval(G, N - 2)));
} ;
})
Return
Dies würde mir auch erlauben, Blöcke zu curry. Meine Frage ist: Wie kann ich auf eine äußere Variable innerhalb eines Blocks in Harbor zugreifen?
@vittore Sorry? –