simplicité

 

Richard Suchenwirth 2004-06-08 - Il est possible d'écrire des choses complexes dans tous les langages de programmation (certains langages nécessitent même cette complexité..). Une des choses que j'aime particulièrement du Tcl est la possibilité d'écrire un code radicalement simple. Je me souviens du "rasoir d'Ockham": Entia non sunt multiplicanda praeter necessitatem (n'utilisez pas plus d'entités (choses) que nécessaire). Cela veut dire :

Avec le Tcl, il est possible d'exprimer beaucoup d'algorithmes plus 'simplement', en une seule ligne de code. Par exemple, choisir un élément aléatoirement d'une liste devient :

 proc lpick list {lindex $list [expr int(rand()*[llength $list])]}

Cette ligne est peut-être un peu compliquée, mais on peut la "digérer" un peu mieux en la regardant de plus près. La commande centrale est lindex, et celle-ci prend un élément de la liste par index numérique. Cet index est calculé avec expr avant d'être invoqué par lindex - la fonction rand() retourne un nombre plus grand que 0, et plus petit que 1; le résultat est ensuite multiplié par la longueur de la liste (llength); et finalement réduit à un nombre entier (integer) avec la fonction int(), un index valable pour lindex. Ça fonctionne, je l'ai essayé!

Le nombre de lignes de code de cette fonction est minimal (1), et celle-ci n'utilise que l'argument unique (list) comme variable.

Il est également possible d'écrire la fonction de cette façon :

 proc lpick {list} {
    set longueur [llength $list]
    set index [expr int(rand()*$longueur)]
    return [lindex $list $index]
 }

où j'ai introduit deux variables locales, et utilisé cinq lignes de code. J'imagine, par contre, que cette fonction est un peu plus lisible et/ou compréhensible que la première pour certains lecteurs.

Qu'en pensez-vous?

VWa Personnellement, quand j'utilise une fonction comme celle-ci, s'il n'y pas d'impératif de performance, je préfère la version longue pour pouvoir la relire.


Un bijou de simplicité est la méthode suivante pour déterminer le signe d'un nombre (1 si positif, 0 si zéro, -1 si négatif), créée par Reinhard Max:

 proc sgn x {expr {($x>0)-($x<0)}}

VWa Bijou de simplicité aussi ; cette procédure, créée par Marc Thirion, détermine si une liste ne contient que des éléments vides, :

 proc estvide { liste } { string is space [eval concat $liste] }

RS: Pardon, mais je pense en cette situation il est plus efficient (et simple) d'écrire

 proc estvide liste {expr {[llength $liste]==0}}

car le longueur d'une liste peut être lu directement, et pour listes qui sont pas vides, la création d'une chaine de caractères n'est pas fait. - Oups, tu voulais examiner listes du type {{} {}} - alors, voilà ma solution, un petit peu plus simple:

 proc estvide liste {string is space [join $liste]}

Pardonnez (et corrigez) mes erreurs - je n'ai presque jamais écrit sur le Tcl, en Français... :)

VWa Plutôt que de pardonner, remercions : c'est super, Richard.


Miko Un invité de marque!!!


ulis, 2004-12-18: Une des choses que j'aime particulièrement du Tcl est la possibilité d'écrire un code radicalement simple. Je partage !

J'ajouterai qu'en plus d'être lisible et maintenable, un code simple est souvent plus rapide.


RS 2007-03-29: Une autre idée sur l'exemple lpick au dessus: j'ai utilisé le nom list pour la liste en question. Mais list est aussi un commande internel de Tcl. Pour éviter des confusion, je crois qu'il serait mieux d'utiliser un autre nom, par exemple lst:

 proc lpick lst {lindex $lst [expr int(rand()*[llength $lst])]}

Voir également Monolignes