Emulation von Schließungen in c

8

Gibt es einen einfachen Weg?

    
Pierreten 20.03.2010, 00:51
quelle

3 Antworten

14

Das ist eine ziemlich breite Frage. Grundsätzlich ist eine Schließung ein Anweisungszeiger zusammen mit einem gespeicherten Kontext, der erforderlich ist, um die Anweisungen in der richtigen Weise auszuführen. Sie können sicherlich so etwas in C mithilfe von Structs und Funktionszeigern zusammenfassen.

Nehmen wir an, Sie drücken eine Schließung aus, die zwei Ints benötigt und void als Struktur zurückgibt:

%Vor%

und angenommen, Sie haben eine Funktion:

%Vor%

Um nun eine Schließung zu erstellen, die Foo (23, 42) aufruft, würden Sie Folgendes tun:

%Vor%

Und dann, um diese Schließung später auszuführen, würden Sie tun:

%Vor%

Noch ein Knick: Die meiste Zeit, in der Sie Closures verwenden, möchten Sie den Kontext über die Lebensdauer des Codeblocks hinaus weitergeben, in dem Sie den Abschluss erstellen. (Beispiel: Sie übergeben die Closure an eine Funktion, die asynchrone E / A-Operationen ausführt und Ihre Closure schließlich aufruft, wenn diese E / A beendet ist). In solchen Fällen müssen Sie sicherstellen, dass Sie Ihren Abschluss auf dem Heap zuweisen und Ihren Abschluss löschen, wenn Sie damit fertig sind. (Siehe vollständiges Beispiel unten).

Eine letzte Anmerkung: Es gibt offensichtlich eine Menge Maschinen hier, und es ist nur für eine Art von Schließung (eine Funktion, die zwei ganzzahlige Argumente benötigt und leer zurückgibt). Wenn ich das in C gesehen habe, wird es oft von einem Code-Generator gemacht, der Maschinen für viele verschiedene Arten von Verschlüssen herstellt. Sie können auch die Menge an Vorsätzen reduzieren, indem Sie nur Closures unterstützen, die einige (feste Anzahl) Argumente void * enthalten, und dann innerhalb der Funktionen, die Sie zum Implementieren dieser Closures verwenden, Typumwandlung eingeben.

Wenn Sie in C ++ sind, können Sie die Sprachfeatures nutzen, um dies viel generischer und mit viel weniger Tippen zu tun. Ein Beispiel finden Sie in Boost.Function .

Vollständiges Beispiel:

%Vor%     
Will Robinson 20.03.2010, 01:18
quelle
-1

Einfache Antwort:

NEIN

Entschuldigung, es sei denn, Sie beschränken dies auf eine sehr kleine Teilmenge der Funktionalität von Closures, so ist es.

    
bmargulies 20.03.2010 01:02
quelle
-1

Ich schätze, es hängt davon ab, was Ihre Idee von "einfach" ist.

Es gibt mehrere Implementierungen von Scheme, die als Erweiterungssprache für C-Programme integriert werden sollen. Verknüpfen Sie ein Schema, schreiben Sie Ihre Schließung in Scheme, und Sie sind fertig.

    
Ken 20.03.2010 01:13
quelle

Tags und Links