Autres articles / Other articles

Les vocabulaires avec ESP32forth

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 ESP32forth, on va utiliser le mot voclist:

internals voclist 

Affiche:

registers
ansi
editor
streams
tasks
oled
rtos
rmt
interrupts
sockets
Serial
ledc
SPIFFS
spi_flash
SPI
SD_MMC
SD
WiFi
Wire
ESP
structures
internalized
internals
FORTH
 ok
-->

Cette liste n'est pas limitée. Des vocabulaires supplémentaires peuvent apparaître si on demande l'accès à certaines définitions:

xtensa-assembler   \ installation of XTENSA Assembler 

Installe deux nouveaux vocabulaires asm et xtensa.

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:

sockets vlist 

Sélectionne le vocabulaire sockets et affiche son contenu:

ip. ip# ->h_addr ->addr! ->addr@ ->port! ->port@ sockaddr l, s, bs, SO_REUSEADDR 
SOL_SOCKET sizeof(sockaddr_in) AF_INET SOCK_RAW SOCK_DGRAM SOCK_STREAM 
socket setsockopt bind listen connect sockaccept select poll send sendto 
sendmsg recv recvfrom recvmsg gethostbyname errno sockets-builtins 

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.

Un même mot peut être défini dans deux vocabulaires différents et avoir deux actions différentes: le mot l est défini dans les deux vocabulaires asm et editor.

C'est encore plus flagrant avec le mot server, défini dans les vocabulaires httpd, telnetd et web-interface.

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.

Ici, on définit un mot serial2-type qui utilise le mot Serial2.write défini dans le vocabulaire serial:

serial \ Select Serial vocabulary 
: serial2-type ( a n -- ) 
    Serial2.write drop 
  ; 

La seconde solution n'est à exploiter que pour intégrer un seul mot d'un vocabulaire spécifique:

: serial2-type ( a n -- ) 
    [ serial ] Serial2.write [ FORTH ]  \ compile word from serial vocabulary 
    drop 
  ; 

La sélection d'un vocabulaire peut être effectuée implicitement depuis un autre mot du vocabulaire FORTH. C'est le cas du mot code disponible après installation de l'assembleur xtensa qui sélectionne le vocabulaire asm.

Dans le cas d'une définition de mot en assembleur xtensa, voici l'ordre de déclaration des vocabulaires:

forth definitions 
asm xtensa 
 
\ calculate the average of two values 
code AVG ( n1 n2 -- n3 )    \ n3 = ( n1 + n2 ) / 2 
    a1 32           ENTRY, 
    a8          arPOP,              \ a8 = n2 
    a9          arPOP,              \ a9 = n1 
    a8 a9 a8        ADD, 
    a8 a8 1         SRAI, 
    a8          arPUSH, 
                    RETW.N, 
end-code 

La première ligne forth definitions force toute nouvelle définition à être placée dans le vocabulaire FORTH.

La seconde ligne asm xtensa force la sélection des vocabulaires asm et xtensa.

A ce stade, pour visualiser les vocabulaires actifs, on peut utiliser le mot order:

asm xtensa 
order   \ display:      xtensa >> asm >> FORTH 

Ceci signifie que l'ordre de recherche des mots passera d'abord par le vocabulaire xtensa, puis par le vocabulaire asm, avant de s'achever par le vocabulaire FORTH.

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:

asm xtensa 
order   \ display:      xtensa >> asm >> FORTH 
only 
order   \ display:      FORTH 

On duplique ensuite le chaînage des vocabulaires avec le mot also:

only 
order   \ display:      FORTH 
asm also 
order   \ display:      asm >> FORTH 
xtensa  
order   \ display:      xtensa >> asm >> FORTH 

Voici une séquence de chainage compacte:

only  asm also  xtensa 

Le dernier vocabulaire ainsi chaîné sera le premier exploré quand on exécutera ou compilera un nouveau mot.

only 
order       \ display:      FORTH 
also ledc also serial also SPIFFS 
order       \ display:      SPIFFS >> FORTH 
            \               Serial >> FORTH 
            \               ledc >> FORTH 
            \               FORTH 

L'ordre de recherche, ici, commencera par le vocabulaire SPIFFS, puis Serial, puis ledc et pour finir le vocabulaire FORTH:


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