Greifen Sie auf äußere Variable in einem Block und Y-Kombinator zu

8

Ich hoffe, es geht euch allen gut. Ich implementiere den Festkomma Kombinator in Harbour und habe einige Probleme damit. Nun, der Y-Kombinator kann durch den Lambda-Kalkül definiert werden als:

Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x)))

Ich versuche, Memoization mit Y-Kombinator durch Leistungsfragen anzuwenden. Meine aktuelle Implementierung ist:

%Vor%

Grundsätzlich kann ich keine Anweisungen innerhalb von Blöcken verwenden, aber ich kann Ausdrücke verwenden und es funktioniert ganz gut. Ich vermeide eine unendliche Rekursion und das Limit, das von 0 nach unendlich geht.

Bis zu diesem Zeitpunkt kompiliert es gut, aber wenn ich versuche, auf eine Variable eines äußeren Blocks zuzugreifen, tritt Harbor mich ins Gesicht!

Um die Y-Kombinator-Implementierung zu testen, versuche ich eine einfache Implementation der Fibonacci-Sequenz anzuwenden, aber wenn ich einen Block zurückgebe, der einen Parameter G empfängt und implizit einen Block zurückgibt, der einen Parameter N ,% co_de erhält % ist für mich nicht verfügbar und der Compiler sagt mir, dass "Äußere Codeblock-Variable nicht erreichbar ist".

%Vor%

Dies würde mir auch erlauben, Blöcke zu curren. Meine Frage ist: Wie kann ich auf eine äußere Variable innerhalb eines Blocks in Harbor zugreifen?

    
Marcelo Camargo 16.03.2015, 17:05
quelle

1 Antwort

4

In Harbor, Clipper und xBase-basierten Programmiersprachen können sich Blöcke never beziehen auf die Variable des Elternblocks. Blöcke sind keine Verschlüsse. Das können wir erreichen Erstellen lokaler Speicher und deren Verwendung in den internen Blöcken:

%Vor%     
Marcelo Camargo 19.08.2015, 13:50
quelle