Les vocabulaires en langage FORTH

publication: 26 février 2023 / mis à jour 25 mai 2023

Read this page in english

 


Les vocabulaires

En FORTH, la notion de procédure et de fonction n'existe pas. Les instructions FORTH s'appellent des MOTS. A l'instar d'une langue traditionnelle, FORTH organise les mots qui le composent en VOCABULAIRES, ensemble de mots ayants un trait communs.

Programmer en FORTH consiste à enrichir un vocabulaire existant, ou à en définir un nouveau, relatif à l'application en cours de développement.

Liste des vocabulaires

Un vocabulaire est une liste ordonnée de mots, recherchés du plus récemment créé au moins récemment créé. L'ordre de recherche est une pile de vocabulaires. L'exécution du nom d'un vocabulaire remplace le haut de la pile d'ordre de recherche par ce vocabulaire.

Pour voir la liste des différents vocabulaires disponibles dans FORTH, on va utiliser le mot voclist:

internals voclist 

Affiche:

registers
internals
graphics
ansi
editor
streams
tasks
windows
structures
recognizers
internalized
internals
FORTH
 ok
-->

Le principal vocabulaire s'appelle FORTH. Tous les autres vocabulaires sont rattachés au vocabulaire FORTH.

Liste du contenu d'un vocabulaire

Pour voir le contenu d'un vocabulaire, on utilise le mot vlist en ayant préalablement sélectionné le vocabulaire adéquat:

graphics vlist 

Sélectionne le vocabulaire graphics et affiche son contenu:

flip poll wait window heart vertical-flip viewport scale translate }g g{ 
screen>g box color pressed? pixel height width event last-char last-key 
mouse-y mouse-x RIGHT-BUTTON MIDDLE-BUTTON LEFT-BUTTON FINISHED TYPED RELEASED 
PRESSED MOTION EXPOSED RESIZED IDLE internals 

La sélection d'un vocabulaire donne accès aux mots définis dans ce vocabulaire.

Par exemple, le mot voclist n'est pas accessible sans invoquer d'abord le vocabulaire internals.

Utilisation des mots d'un vocabulaire

Pour compiler un mot défini dans un autre vocabulaire que FORTH, il y a deux solutions. La première solution consiste à appeler simplement ce vocabulaire avant de définir le mot qui va utiliser des mots de ce vocabulaire.

Chainage des vocabulaires

L'ordre de recherche d'un mot dans un vocabulaire peut être très important. En cas de mots ayant un même nom, on lève toute ambiguïté en maitrisant l'ordre de recherche dans les différents vocabulaires qui nous intéressent.

Avant de créer un chaînage de vocabulaires, on restreint l'ordre de recherche avec le mot only.

Créer un nouveau vocabulaire

Pour créer un nouveau vocabulaire, on utilise le mot-clé VOCABULARY:

VOCABULARY OUTILS 

Ceci crée le vocabulaire OUTILS.

Pour que Forth cherche les mots dans ce nouveau dictionnaire, il suffit de taper son nom:

OUTILS 

Désormais, l'interpréteur cherchera d'abord dans OUTILS, puis dans FORTH.

Pour que les nouveaux mots soient créés dans le vocabulaire OUTILS, on utilise le mot DEFINITIONS:

OUTILS DEFINITIONS 
 
: TEST ( -- )  
    ." Je suis dans OUTILS" 
  ; 

On vérifie la présence de notre mot TEST dans OUTILS:

 outils vlist 
TEST 

Pour arrêter d'ajouter des mots à OUTILS et revenir au dictionnaire de base:

FORTH DEFINITIONS 
: TEST ( -- )  
    ." Je suis dans FORTH" 
  ; 

Les vocabulaires ne sont faits seulement pour régler des problèmes de noms identiques. Revenons sur le vocabulaire windows dans eForth Windows:

page windows vlist 

S'affiche immédiatement une quantité impressionnante de mots. Ces mots sont définis dans ce vocabulaire windows pour éviter l'encombrement du vocabulaire FORTH de base.

Voici un cas pratique pour étendre ce vocabulaire windows:

only forth  
also windows 
windows definitions 
structures 
 
\ Appends one string to another 
z" lstrcatA" 2 Kernel32 lstrcatA  ( lpString1 lpString2 -- lpString1|0 ) 
 
\ returns the system's time and date 
z" GetLocalTime"       1 Kernel32 GetLocalTime ( addr -- ) 
 
\ structure control for timeouts 
struct COMMTIMEOUTS 
  i32 field ->ReadIntervalTimeout 
  i32 field ->ReadTotalTimeoutMultiplier 
  i32 field ->ReadTotalTimeoutConstant 
  i32 field ->WriteTotalTimeoutMultiplier 
  i32 field ->WriteTotalTimeoutConstant 
 
\ sets the time-out parameters for all read and write operations on a specified communications device 
z" SetCommTimeouts" 2 Kernel32 SetCommTimeouts  ( hSerial timeouts -- fl ) 
 
only forth definitions 

Expliquons les quatre premières lignes:

Ce petit morceau de code rajoute les mots suivants: lstrcatA GetLocalTime COMMTIMEOUTS ->ReadIntervalTimeout ->ReadTotalTimeoutMultiplier etc....


Legal: site web personnel sans commerce / personal site without seling