apply

 

Applique une fonction anonyme. Anonyme s'entend au sens ou la fonction, qui est fondamentalement identique à une procédure, n'existe que le temps de son utilisation. La commande apply est donc particulièrement utile pour écrire des commandes à usage unique.

Mais la vocation première d'apply est d'apporter les mécanismes nécessaires à la programmation fonctionnelle et au lambda-calcul en Tcl.

Utilisation :

 apply func ?arg1 arg2 ...?

func doit impérativement être une liste de 2 éléments {args body} (comme pour une proc) ou 3 éléments {args body namespace}.

La commande apply applique la fonction func aux arguments arg1 arg2 ... et retourne le résultat.

Manuel :

 http://www.tcl.tk/man/tcl8.5/TclCmd/apply.htm

Pour plus de clarté dans les exemples ci-dessous, j'ai essayé de laisser la fonction dans la commande [list ... ] avec le body indenté comme il le serait dans une procédure. Les lignes qui commence par → sont les résultats des commandes.

Exemple simple :

 apply [list {a b} {
     puts "$a aime $b"
 }] papa maman
 → papa aime maman

Exemple avec un namespace :

 namespace eval ::testNS {}
 apply [list {x} {
     variable testVar
     set testVar [expr {$x*$x}]
     return
 } ::testNS] 5
 set ::testNS::testVar
 → 25

Exemples plus complexes :

Ce premier exemple montre que l'argument spécial args est valable pour apply.

 apply [list {args} {
     set r {}
     foreach arg $args {
         lappend r [string length $arg]:$arg
     }
     return $r
 }] a bb ccc dddd
 → 1:a 2:bb 3:ccc 4:dddd

Ce deuxième exemple (écrit par Andy Goth) ne pourrait pas être écrit simplement sans apply à moins d'écrire une procédure de tri qui va polluer l'espace global, peut-être pour une unique utilisation.

 lsort -command {apply {{a b} {
     set result [expr {[string length $a] - [string length $b]}]
     if {$result == 0} {
         set result [string compare $a $b]
     }
     return $result
 }}} {orange red yellow green blue indigo violet}
 → red blue green indigo orange violet yellow

Catégorie Manuel Tcl/Tk