Dans la documentation du langage,
"Factor documentation > Factor handbook > Your first program"
(il y a) un exemple (de programme) qui teste si un texte est un
palindrome.
Une extension suppose que
"A man, a plan, a canal: Panama."
est un palindrome... si on arrive � �liminer tous les caract�res qui ne
sont pas des lettres ( espace : . ) et si on met en minuscules.
Cela se fait en utilisant
[ Letter? ] renvoie vrai ou faux apr�s chacun des caract�res contenus
dans la cha�ne (lettre = oui, pas-lettre = faux)
filter garde chaque caract�re qui est associ� � un vrai
>lower met en caract�res minuscules
Comme on est en logique Forth, on va cr�er un mot qui effectue ces
op�rations en les encha�nant :
: normalize ( str -- newstr ) [ Letter? ] filter >lower ;
Maintenant on cr�e le mot palindrome? qui renvoie vrai si le texte
obtenu est un palindrome :
: palindrome? ( str -- ? ) normalize dup reverse = ;
Si maintenant, on tape
"A man, a plan, a canal: Panama." palindrome? .
on obtient vrai...
Bon l'exemple montre la compacit� d'un langage � la Forth.
Ceci �tant, cette mani�re de penser la r�solution d'une difficult� vient
peut-�tre de praticiens d'un autre langage Lisp ? Java ?
Avez-vous une r�ponse ?
A+
Alain
Plutᅵt Lisp car c'est une forme assez idiomatique du style de
programmation dit "fonctionnel" (FP). "filter" est une fonction ᅵ l'instar
des relativement cᅵlᅵbres "map" et "fold". Cela dit, il n'y a pas que Lisp
qui fait cela; mais Java n'est clairement pas adaptᅵ ᅵ ce style.
Quelques exemples typiques en pseudo-code (ou presque ;-):
let l : (10 20 30 40) {une liste}
map (form x -> x*2) l
{
le resultat est (20 40 60 80); le machin entre parenthᅵses qui
commence par "form" est la spᅵcification d'une fonction anonyme, qui pour
une variable x retourne son double.
}
let l2 : ( 1 2 3 4)
fold l2 (form x,y -> x+y)
{ le rᅵsultat est 10. "fold" procᅵde ainsi:
on part de la donnᅵe initiale: (1 2 3 4)
on applique l'opᅵration sur les deux premiers ᅵlᅵments de la liste, ce
qui donne: (1+2 3 4)
encore: (1+2+3 4)
encore: (1+2+3+4)=10
Bien sᅵr, il y a les cas particuliers oᅵ la liste est vide ou ne
contient qu'un ᅵlᅵment.
Une autre application:
}
fold (12 98 304 -34) (form x,y -> max x y)
{resultat: le maximum de la liste}
Les chaines de caractᅵres pouvant ᅵtre vues comme des listes de
caractᅵres, on peut dᅵfinir des opᅵrations similaires pour elles.
Alain