Sinn und Unsinn von Closures?



  • Hi
    Jetzt da wegen dem neuen C++ Standard das Wort hier auch schon häufiger auftritt wollte ich mal fragen was eigentlich der Sinn von Closures ist?
    Wenn ich das Konzept richtig verstanden hab können die nichts was man nicht auch mit Funktionen und Functionpointer oder in anderen Sprachen delegates hinbekommen könnte, oder?
    Im Gegenteil habe ich in C# die Erfahrung gemacht, dass Code mit Lambda Expressions häufiger Fehler enthält und schwerer zu debuggen ist, sodass ich die Lambda Expressions letzten Endes doch zur Funktion gemacht habe.
    Also: Wozu braucht man Closures, haben die irgend einen tieferen Sinn, den ich noch nicht verstanden hab?



  • Delegates sind eine Art closure light.

    Der wichtige Unterschied zu einfachen Funktionen ist, dass man lokale Variablen aus dem Scope einer anderen Funktion referenzieren kann.

    Hier mal ein kleines Beispiel:

    void foo(){
      int a;
      vector<int>vec = ...;
      partition(vec.begin(), vec.end(), 
        <>(int x)->bool{ return x < a; })
    }
    

    Dies ist eine Quicksort-Partition mit a als Pivot. (Syntax ohne Gewähr.)

    Hier kann man argumentieren, dass es hier auch ohne geht. Wo es aber nicht mehr gut ohne geht sind zum Beispiel Callbacks bei GUIs. GTKmm macht bei seinen Signalen nichts anderes, als einfache Lambdaausdrücke zu bauen. Allerdings bei weitem nicht so flexibel wie die Spracherweiterung.

    Da kann heute nur boost.lambda mithalten und da ist der Syntax nicht so schön und mit vielen Fallen gespickt.

    Du kannst Lambdaausdrücke mit Funktoren vergleichen. Jeden Lambdaausdrücke kann man durch einen Funktor ersetzen allerdings wird das sehr viel Tipparbeit.



  • Gilt das Yoneda-Lemma auch für closures?



  • JustAnotherNoob schrieb:

    Im Gegenteil habe ich in C# die Erfahrung gemacht, dass Code mit Lambda Expressions häufiger Fehler enthält und schwerer zu debuggen ist, sodass ich die Lambda Expressions letzten Endes doch zur Funktion gemacht habe.

    Diese Erfahrung kann ich nicht nachvollziehen. Lambdas werden doch genau dort eingesetzt, wo nur sehr wenig Logik notwendig ist, z.B. ein einziger Funktionsaufruf (d.h. das Lambda agiert hier quasi als Schnittstellen-Adapter). Da muss überhaupt nichts debuggt werden.

    @Ben04: Damit das ein Quicksort wird, fehlt Dir da aber die Rekursion. 😉



  • Konrad Rudolph schrieb:

    @Ben04: Damit das ein Quicksort wird, fehlt Dir da aber die Rekursion. 😉

    Wieso glaubst du Schlaumeier wohl, dass da "Quicksort-Partition" und nicht "Quicksort" steht?



  • Ben04 schrieb:

    Konrad Rudolph schrieb:

    @Ben04: Damit das ein Quicksort wird, fehlt Dir da aber die Rekursion. 😉

    Wieso glaubst du Schlaumeier wohl, dass da "Quicksort-Partition" und nicht "Quicksort" steht?

    Wieso so genervt?


Anmelden zum Antworten