Les vocabulaires avec ESP32forth
publication: 26 février 2023 / mis à jour 25 mai 2023
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
.
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
:
- si le mot recherché n'est pas trouvé, il y a une erreur de compilation;
- si le mot est trouvé dans un vocabulaire, c'est ce mot qui sera compilé, même s'il est défini dans le vocabulaire suivant;
Legal: site web personnel sans commerce / personal site without seling