Présentation de Defer

La fonctionnalité Defer de Go permet de retarder l'exécution d'une fonction jusqu'à la fin de la fonction englobante. Elle est souvent utilisée pour garder l'acquisition et la libération des ressources ensemble.

Implémentation de Defer dans TypeScript

Pour ajouter Defer à TypeScript, nous devons modifier le compilateur TypeScript pour qu'il reconnaisse la syntaxe Defer et la remplace par une syntaxe équivalente. Le compilateur TypeScript effectue déjà des transformations d'AST (Abstract Syntax Tree) en AST, nous pouvons donc utiliser cette fonctionnalité pour ajouter Defer.

function f() { defer cleanup(); work(); }

sera transformé en

function f() { const __defers = []; try { __defers.push(() => cleanup()); work(); } finally { // Pop and invoke } }

Fonctionnement de Defer

La fonctionnalité Defer capture les valeurs de l'appelant, du récepteur et des arguments immédiatement. Si une fonction contient au moins un Defer, elle reçoit une petite pile, et chaque instruction Defer atteinte pousse une fermeture sur cette pile. Lorsque la fonction se termine, la pile est vidée dans l'ordre inverse (dernier entré, premier sorti).

Erreurs et Defer

Le code de nettoyage peut également échouer, le transformateur suit donc trois règles : chaque appel différé s'exécute, même si un appel précédent échoue ; l'erreur d'origine de la fonction est préservée ; si plusieurs erreurs se produisent, elles sont signalées avec une AggregateError.