Semaine d'informatique - Et pourquoi pas réformer l'indentation ?
Aujourd’hui, parlons d’une alternative peu connue (et malheureusement peu disponible) aux méthodes d’indentation classiques: les taquets de tabulation élastiques.
Dans cet article, je vais donner une courte introduction aux taquets de tabulation élastiques (elastic tabstops), une idée proposée par Nick Gravgaard en 2006 (https://nick-gravgaard.com/elastic-tabstops). Spécifiquement, je parlerai de la version décrite un peu plus tard ici (https://github.com/nick-gravgaard/ElasticNotepad/issues/4).
L’idée est la suivante: souvent, quand on écrit du code, on a besoin de l’aligner. Par exemple, en OCaml:
type t = {
fooo : foo_t;
bar : bar_t;
bazzz : baz_t;
}
let rec eval e =
match e with
| Int i -> i
| Add (e, e') -> eval e + eval e'
| Mult (e, e') -> eval e * eval e'
let f foo
bar
baazz
foobar
bazar =
bar (foo baazz) (bazar foobar bar)
let l = [
[foo; abcd; 563 ];
[baar; efg; 1 ];
[bazzz; hijkl; 67 ];
]
Que l’on soit en accord sur ces exemples en particulier ou pas, il est probable que vous ressentiez de temps en temps ce besoin d’alignement.
Mais, donc, que proposent les taquets de tabulation élastiques ? Eh bien, l’utilisation de tabulations pour gérer l’alignement. En l’occurence, l’algorithme fonctionne comme suit:
- Tout d’abord, le texte est découpé en groupes de lignes qui ont le même nombre d’indentations (tabulations sans autres caractères en début de ligne). On opère indépendament sur chacuns de ces groupes.
- Ensuite, on regarde les tabulations internes à la ligne, que l’on numérotes. Dès que, sur des lignes adjacentes des tabulations ont le même numéro, on calcule la position nécessaire pour que les tabulations soient alignées, et on les mets toutes à cette position.
C’est tout ! Voici, donc, la manière d’écrire les exemples précédents, en
marquant ⎸ les tabulations et • les espaces importants.
type t = {
⎸ fooo⎸ : foo_t;
⎸ bar⎸ : bar_t;
⎸ bazzz⎸: baz_t;
}
let rec eval e =
⎸ match e with
⎸ | Int i⎸ -> i
⎸ | Add (e, e')⎸ -> eval e + eval e'
⎸ | Mult (e, e')⎸-> eval e * eval e'
let f⎸foo
•⎸ bar
•⎸ baazz
•⎸ foobar
•⎸ bazar =
⎸ bar (foo baazz) (bazar foobar bar)
let l = [
⎸ [foo;⎸ abcd;⎸ 563⎸];
⎸ [baar;⎸ efg;⎸ 1⎸ ];
⎸ [bazzz;⎸hijkl;⎸67⎸ ];
]
Voilà, j’espère que ce petit tour d’une idée que je trouve intéressante vous a plu, n’hésitez pas à faire une guerre sainte sur IP7 sur les choix de formattage (en restant poli·e·s et courtois·e·s bien sûr), et une bonne journée à vous.
À bientôt,
Amélia Coutard-Sander.