Toujours à propos de Factor

3 views
Skip to first unread message

alain

unread,
Aug 3, 2010, 12:06:17 PM8/3/10
to liste armada, forth-...@googlegroups.com
Bonsoir,

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

frederic

unread,
Aug 3, 2010, 12:47:19 PM8/3/10
to liste armada, forth-...@googlegroups.com, alain
> 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 ?
>

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.

Bernard alain

unread,
Aug 4, 2010, 6:08:33 AM8/4/10
to forth-...@googlegroups.com
Le mardi 03 août 2010 à 18:47 +0200, frederic a écrit :
> > 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 ?
> >
>
Ce qui m'inquiète dans ce langage, c'est la syntaxe qui parait complexe
avec l'utilisation des accolades, parenthèses, crochets, la description
des effets de pile. Le C parait simple en comparaison et le Forth est
plus sympa moins formalisé.
Un vrai travail d'apprentissage à faire sur Factor.

Alain


Reply all
Reply to author
Forward
0 new messages