(Compiler-?)Problem mit Closures/Lazy Evaluation



  • Vielen Dank!
    Hast du eine Idee für einen Workaround für den VC++?
    EDIT: Abgesehen von

    a + b + C(b * a) == a;
    


  • 🙂



  • Hast du eine Idee für einen Workaround für den VC++?

    Ne. Ich beherrsche C++ leider nicht gut genug um mir Workarounds auf dem Papier ausdenken zu können. Dafür brauche ich immer den entsprechenden Compiler zum Testen. Und da ich den neuen VC++ nicht besitze, wird das nichts.



  • Könnte mir jemand freundlicherweise erläutern, was der Code mit fauler Auswertung oder Closures zu tun hat. Ich versuche das schon seit Threadbeginn herauszufinden, komme aber nicht wirklich weiter -- Vielen Dank.



  • Die + und * Operatoren liefern erstmal sowas wie Thunks zurück, C + C => Cp und C * C => Cq, die erst bei Bedarf wieder in C konvertiert werden. Closures seh ich allerdings nirgends, ich bezweifle auch, dass es sowas in C++ geben kann.



  • Ah, jetzt habe ich mir das mal aufgemalt. Die eigentliche Auswertung findet erst dann statt, wenn die C? nach C konvertiert werden, wobei dann die o?-Funktionen wirklich 'arbeiten'. Chique.



  • Bashar schrieb:

    Closures seh ich allerdings nirgends, ich bezweifle auch, dass es sowas in C++ geben kann.

    Warum nicht? Was versteht man unter Closures? Ich beziehe mich darauf:

    B. Stroustrup, TC++PL §22.4.7 schrieb:

    Das von * erzeugte Objekt ist in etwa das, was man im technischen Umfeld auch als Abschluß (englisch: closure) nennt.



  • Ja, was sind eigentlich Closures? Im Wesentlichen Bezüge ('Referenzen') auf (unbenannte?) Funktionen, wobei deren 'Zustand' (bzw der Zustand ihrer Argumente) erhalten bleibt. Oder so ähnlich :).
    Stroustrup meint http://www.research.att.com/~bs/glossary.html#Gclosure



  • Stroustrup meint damit etwa sowas:

    struct Closure {
      T1 operator()(T2,  ....) {
        // ...
      }
      Closure(....): initialisiererliste {... }
    private:
      // ein paar Daten
    };
    

    wobei die privaten Daten beim Erstellen des Objektes gesetzt werden. Für echte Closures müßte der Compiler aber selbst erkennen, welche Variablen der operator() benutzt. Diese Technik ist vor allem in funktionalen Sprachen gebräuchlich, besonders zusammen mit anonymen Funktionen.

    Ohne diesen Automatismus würd ich nicht von Closures reden. Man kann aber trotzdem in C++ in eingeschränktem Maße und umständlich funktional programmieren. Siehe z.B. den Header <functional>, oder boost::spirit.



  • Man kann aber trotzdem in C++ in eingeschränktem Maße und umständlich funktional programmieren. Siehe z.B. den Header <functional>, oder boost::spirit

    Oder boost::mpl oder FC++


Anmelden zum Antworten