2015-03-16 10 views
8

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?

+0

@vittore Sorry? –

Antwort

4

In Harbor, Clipper und xBase-basierten Programmiersprachen, Blöcke nie kann auf die Variable des übergeordneten Blocks beziehen. Blöcke sind keine Verschlüsse. Wir können das durch erreichen, indem wir lokale Speicher erstellen und sie in den internen Blöcken verwenden:

Verwandte Themen