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.