Discussion sur le langage Forth

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Répondre
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Discussion sur le langage Forth

Message par Xavier31 »

[edit Fabien] Division du sujet initial http://forum.system-cfg.com/viewtopic.php?t=4189 [/edit]

Bonjour,
suite à votre intéressante discussion sur le langage Forth, j'ai dégoté un fig-FORTH sur un émulateur Amstrad CPC
et j'essaie de taper des lignes de codes que j'ai trouvées ici et la sur Internet et sur votre forum. (merci Yo_fr)
Mon but est simplement de m'initier à la programmation du Forth.
J'essaie d'écrire un mot Forth qui me donne la factorielle d'un nombre entier, par exemple.

J'avais trouvé un exemple simple sur internet,

Code : Tout sélectionner

: factorielle

dup 1 - dup 1 >

IF RECURSIVE THEN *;
mais le mot RECURSIVE n'est pas accepté par mon Forth sur Amstrad CPC. J'essaie donc de faire autrement.

Autres question : J'ai cru remarqué que les extensions de fichiers des programmes Fig-Forth sont .fig sur CPC.

Les programmes sont-t-ils exécutables SANS le programmes FORTH présent sur la disquette ?

(Je ne peux enregistrer et charger qu'avec une cassette virtuelle avec GET et PUT, pas de routine disquette,
mais bon...)
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

J'ai fait le programme "factorielle" en Basic.

Code : Tout sélectionner

10 F=1:P=1
20 INPUT "Nombre : ",N
30 F=F * P : P=P+1
40 IF P>N THEN PRINT F: GOTO 10
50 GOTO 30
ou bien de cette façon :

Code : Tout sélectionner

10 F=1
20 INPUT "Nombre : ",N : IF N=0 THEN N=1
30 F=F * N
40 N=N-1 : IF N>1 THEN 30
50 PRINT F : GOTO 10
J'aimerais bien l'écrire en Forth.
J'ai trouvé comment faire un IF THEN ELSE en Forth, et afficher à l'écran le sommet de la pile. (ici l'âge donné).
Mais comment remplacer RECURSIVE ?

Code : Tout sélectionner

: AGE
DUP 17>
IF ." Vous etes majeur : " . ." ans "
ELSE ." Vous etes mineur : " . ." ans "
THEN;
Toute aide sera la bienvenue. :)
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par yo_fr »

Houla !
La recursivité en forth n'est pas évidente. De mémoire (à prendre avec des pincettes donc) : pour pouvoir faire de la récursivité il faut utiliser un mot dans une définition de mot qui n'est pas encore défini (puisque c'est lui-même ! ) et le tout sans le mot magique recusive...
Le mot smudge est peut être une solution (il modifie le flag de bonne définition d'un mot Forth), mais c'est pas sur. Un autre piste serait d'utiliser d'autre mot de haut niveau (que je n'ai plus en tête...) et d'utilisation délicate. L'utilisation des mots de haut niveau et l'une des difficultés du Forth : avec ces mots on peu créer des mots qui génère des mots, ... la récursivité doit être aussi possible :wink:
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

Et sans récursivité ? comment faire ? Je voudrais juste écrire un programme qui donne la factorielle d'un nombre.

Par exemple la factorielle de 3 = 1 x 2 x 3 = 6
la factorielle de 5 = 1 x 2 x 3 x 4 x 5 = 120

Comment programmer ça en Forth ? J'ai pensé :

A - on duplique le sommet de la pile : DUP
B - On soustrait 1 pour obtenir le prochain nombre à multiplier : 1 -
C - on compare s'il est supérieur à 1 : DUP 1>
D - Si oui on multiplie avec * et on recommence à l'étape B
E - Si non j'affiche le résultat final avec .

si je pouvais faire un IF true branchement vers B ELSE branchement vers E, ce serait super.

ça ne fait que 1 jour que je fais du Forth, donc désolé pour ces questions un peu stupides... :oops:
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

J'ai fait ceci :

Code : Tout sélectionner

: factorielle
BEGIN  
DUP 1 - DUP 1 >
WHILE * 
REPEAT
. ;
mais ça marche pas. Je retourne RTFM :mrgreen:
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

Hoho! je viens de réussir à le faire en mode direct! J'ai bien obtenu la factorielle d'un entier. :)

D'abord j'ai regardé en mode direct comment fonctionne la pile. Mon manuel étant pourri, j'ai fait mes tests à la main.

Le point . affiche le contenu du sommet de la pile, mais il fait un pop, donc décale la pile et fait sortir la valeur.
Le .S affiche le contenu de toute la pile, mais sans toucher à la pile.

J'ai vidé la pile, puis mis dedans uniquement la valeur 5 (au sommet donc) puis j'ai fait un DUP 1-
Cela duplique bien le sommet de la pile et décrémente la valeur au sommet. Au sommet se trouve maintenant 4, puis 5 juste en dessous. la pile contient 5 4 (.S l'affiche, 4 c'est le sommet, toujours à droite)
J'ai refait un DUP 1- qui a dupliqué la valeur décrémentée au sommet en poussant les autres vers le bas. la pile contient 5 4 3 (.S l'affiche)
J'ai continué jusqu'à obtenir les valeurs 5 4 3 2 1 placées dans la pile. (1 est le sommet de la pile)

- J'ai fait un * puis j'ai affiché le contenu de la pile avec .S

- elle contient maintenant 5 4 3 2, ce qui montre que les 2 valeurs du haut de la pile se sont multipliées entre elles, et qu'un pop a été effectué.

(quand vous mettez une valeur dans la pile, ça fait un push, quand vous la sortez ça fait un pop, c'est du Lifo.)

- la pile contient maintenant 5 4 3 2. un nouveau * devrait multiplier le 2 avec le 3 et faire un pop

- ça marche : la pile contient maintenant 5 4 6. un nouveau * devrait multiplier le 6 avec le 4 et faire un pop

- la pile contient 5 24. un nouveau * devrait multiplier le 24 avec le 5 et faire un pop

- la pile contient maintenant uniquement 120, qui est bien la factorielle de 5 : 1 x 2 x 3 x 4 x 5 = 120

Maintenant que j'ai pigé comment fonctionne la pile du Forth, je devrais pouvoir écrire la routine avec une boucle qui fait ça.

Je m'en souviendrai de mon premier jour de FORTH! :mrgreen:
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Daniel »

La pile du FORTH est un concept intéressant, qui doit permettre de trouver des solutions à beaucoup d'autres problèmes du même type. Finalement, il est peut-être plus facile d'écrire une procédure récursive en FORTH qu'en Basic. Je ne dis pas que c'est évident, mais quand on a acquis les principes c'est plus facile. En Basic, il faut stocker les variables dans des tableaux indicés par le niveau de la récursivité. Je l'ai fait dans ma jeunesse pour résoudre le très classique problème des tours de Hanoï. En y réfléchissant bien, ces tableaux étaient utilisés comme des piles LIFO, il doit donc être possible d'utiliser la pile FORTH pour faire la même chose.
Daniel
L'obstacle augmente mon ardeur.
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

Je viens justement de tomber un programme " Tours de Hanoï " sur Jupiter ACE :
http://www.jupiter-ace.co.uk/listing_TOH_ricardo.html

Peut-être à adapter pour le MO5 ?
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Daniel »

Après avoir parcouru rapidement le programme, je crois qu'il se contente d'exécuter les mouvements saisis par un opérateur. Je me trompe peut-être ? Pour moi, un programme de Tours de Hanoï se doit de résoudre le problème, c'est à dire déplacer la tour d'une base à l'autre sans intervention humaine. Sinon c'est sans intérêt.

Un autre exercice intéressant se prêtant bien à la récursivité est le PAINT : remplissage d'un contour fermé quelconque. Ce n'est pas à la portée du débutant, mais si en plus on cherche à faire le code le plus court et le plus rapide possible c'est une excellente gymnastique intellectuelle. Je l'avais programmé sur Thomson. Je crois que le code en langage machine était si court que le l'avais fait tenir dans un programme Basic de 2 lignes (à l'époque du concours deuligne d'Hebdogiciel).
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
jfg
Messages : 245
Inscription : 22 mars 2011 16:28
Localisation : Région parisienne

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par jfg »

Daniel a écrit :Un autre exercice intéressant se prêtant bien à la récursivité est le PAINT : remplissage d'un contour fermé quelconque.
On avait aussi écrit ce même programme pour Alice (en assembleur), afin d'offrir des extensions au Basic. Il n'a jamais été utilisé, mais on était très fier du résultat...
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Daniel »

J'ai retrouvé mes petits chefs-d'oeuvre MO5 utilisant la récursivité. Vingt-huit ans après j'en suis encore très fier :wink:

Les Tours de Hanoï en deuligne

Code : Tout sélectionner

1 IFL>0THENIFD>0THEND=D-1:T=3-F-T:GOSUB1
:T=3-F-T:GOSUB2:F=3-F-T:GOSUB1:F=3-F-T:D
=D+1:RETURNELSERETURNELSECLS:SCREEN1,7,7
:H=PEEK(8E3)+1:POKE8E3,H:LOCATE0,1,0:PRI
NT"(DC) Tours de Hanoï hauteur"H:D=H:DIM
D(2,D):W=H+H+1:Z=W+30:BOX(0,Z)-(3*W+1,Z+
1):T=2:COLOR0
2 IFL>0THENU=D(F,0):V=D(T,0)+1:X=F*W:Y=Z
-2*U:LINE(X,Y)-(X+W,Y),-8:X=T*W:Y=Z-2*V:
L=D(F,U):LINE(X+L,Y)-(X+W-L,Y):D(F,U)=0:
D(F,0)=U-1:D(T,V)=L:D(T,0)=V:N=N+1:LOCAT
E32,1:PRINTN:RETURNELSED(0,0)=D:Y=Z:FORL
=1TOH:D(0,L)=L:Y=Y-2:LINE(L,Y)-(W-L,Y):N
EXT:GOSUB1:RUN
Paint en deuligne

Code : Tout sélectionner

1 P$="3F1624FC3F1825F8CE8FFF3630313F3630
3730301F8C00002D053F145D2DF430013F10313F
8D3031228D2C313F30018C013F2E0F3F145D2C0A
313F8D1131228D0D20E8301F3F0E11838FFF25C4
39301F3F1430015D2D133F145D2C0E108C00002D
08108C00C72E02363039":LOCATE0,2,0:PRINT"
Contour ?
2 IFI=0THENCLS:SCREEN11,4,6:PRINT"PAINT
 (C) Daniel xxxxxxxx":FORI=0TO107:POKE2E
4+I,VAL("&H"+MID$(P$,I+I+1,2)):NEXT:GOTO
1ELSEIFPTRIGTHENINPENX,Y:IFW=0THENPSET(X
,Y):W=1:GOTO2ELSELINE-(X,Y):GOTO2ELSEIFW
=0GOTO2ELSELOCATE0,2:PRINT"Pointez !":EX
EC2E4:W=0:GOTO1
Daniel
L'obstacle augmente mon ardeur.
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

Merci Daniel pour ces 2 programmes.

Voici mon premier programme pour résoudre une factorielle en FORTH :
Pour le tester, tapez 0 FACTO ou bien 3 FACTO ou bien 5 FACTO, etc. Le résultat s'affiche à l'écran.
(Le nombre doit être compris entre zéro et 7)
Il faudrait le tester sur MO5 pour voir si il fonctionne aussi (à priori il n'y a pas de raison)

Code : Tout sélectionner

: FACTO 
DUP 0 < OVER 7 > OR IF ." Invalid number" QUIT THEN 
1 SWAP DUP 0 = IF DROP 1 THEN   
BEGIN
DUP 2 > 
WHILE DUP 1 -
REPEAT
BEGIN SWAP DUP 1 >
WHILE SWAP *
REPEAT
DROP
.  ; 
Dernière modification par Xavier31 le 15 mars 2013 21:48, modifié 1 fois.
Avatar de l’utilisateur
yo_fr
Messages : 1336
Inscription : 13 août 2009 18:24
Localisation : 78...
Contact :

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par yo_fr »

Tu as mis un contrôle à maxi 7 car après tu as des débordements de pile ?
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par Xavier31 »

J'ai mis un contrôle car
8 FACTO m'affiche -25216 au lieu de 40 320
9 FACTO m'affiche -30336 au lieu de 362 880
10 FACTO m'affiche 24320 au lieu de 3 628 800

Je ne sais pas comment afficher en FORTH les nombres entiers supérieurs à 32768

Ricardo F. Lopes l'a fait, mais je ne sais pas encore aussi bien programmer en FORTH :
http://www.jupiter-ace.co.uk/listing_factorials.html

J'ai donc fait un programme de débutant en attendant de savoir afficher les grands nombres. :D
Avatar de l’utilisateur
fneck
Site Admin
Messages : 17423
Inscription : 01 avr. 2007 12:03
Localisation : Drôme Provençale (26)
Contact :

Re: [Thomson] Nouveaux programmes transférés sur PC

Message par fneck »

Je vous lis avec attention sans intervenir car c'est bien au delà de mes compétences, mais je me demande s'il ne serait pas intéressant de séparer cette discussion récente sur le Foth car on est loin du topic original de transfert Thomson sur PC? Par exemple dans "développement actuel"?

[edit] Voila, c'est fait 8)
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Répondre