• # Le diable est l'ennemi du détail (ou un truc comme ça)

    Posté par . En réponse au journal Une 20-aine de lignes de code pour le defer de Go en C++. Évalué à 3.

     ~defer_frame() {
     std::for_each(m_funcs.rbegin(), m_funcs.rend(), [](auto &f) {
     f();
     });
     }
     void defer(function fn) {
     m_funcs.push_back(fn);
     }

    Je ne fais ni de c++ ni de go, mais il me semble que l'ordre de libération est inverse. Ce serait plutôt une pile qu'il faut utiliser.

    D'ailleurs il me semble que la gestion des scopes doit pouvoir devenir pigeux :

    En go, j'imagine que ça :

    func example() error {
     rsrc1 := CreateResource()
     defer rsrc1.Destroy()
     if foo {
     bar := bazz()
     defer bar.Destroy()
     // some stuff
     }
     return nil
    }

    Devra se traduire par :

    void example() {
     new_defer_frame();
     auto rsrc1 = CreateResource();
     defer({ rsrc1.Destroy(); });
     if (foo) {
     new_defer_frame();
     auto bar = bazz();
     defer({ bar.Destroy(); });
     // some stuff
     }
    }

    C'est piégeux de devoir gérer manuellement le contexte (la frame).

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll