Reconnaitre les nombres binaires et décimaux
publication: 30 avril 2024 / mis à jour 30 avril 2024
La version actuelle d'ESP32forth accepte la saisie de nombres sous deux formes :
1234
selon la base numérique actuelle$12b3
pour les valeurs explicitement hexadécimales
Je propose que le mécanisme permettant la saisie explicite dans une base numérique spécifique soit étendu :
%10001011
pour les valeurs explicitement binaires#2024
pour les valeurs explicitement décimales
Ce développement est très simple à intégrer. Il suffit de rechercher convert( dans le code source de ESP32forth, puis de rajouter les deux lignes en rouge:
static cell_t convert(const char *pos, cell_t n, cell_t base, cell_t *ret) { *ret = 0; cell_t negate = 0; if (!n) { return 0; } if (*pos == '-') { negate = -1; ++pos; --n; } if (*pos == '$') { base = 16; ++pos; --n; } if (*pos == '%') { base = 2; ++pos; --n; } if (*pos == '#') { base = 10; ++pos; --n; } for (; n; --n) { uintptr_t d = UPPER(*pos) - '0'; if (d > 9) { d -= 7; if (d < 10) { return 0; } } if (d >= (uintptr_t) base) { return 0; } *ret = *ret * base + d; ++pos; } if (negate) { *ret = -*ret; } return -1; }
Cette fonctionnalité existe déjà dans d'autres versions du langage FORTH, FlashForth par exemple...
J'ai testé ce développement et cela ne perturbe pas le fonctionnement de ESP32forth.
Il offre l'avantage de ne pas avoir à sélectionner une base numérique spécifique, notamment le BINAIRE
et des bases numériques DECIMAL
juste pour marquer une valeur.
Cela lève également des ambiguïtés sur certaines valeurs pour lesquelles nous ne sommes pas certains de leur base numérique.
Exemple: 08
contre $08
qui pourrait devenir %00001000
en binaire.
Exemple de code FORTH avant cette modification:
: test3 ( -- )
init.VSPI
MAX7219.normal
$01 MAX7219.intensity
$07 MAX7219.scan.limit
$00 MAX7219.decode
[ 2 base ! ]
01100110 _DIGIT7 MAX7219.set.digit
01100110 _DIGIT7 MAX7219.set.digit
01100110 _DIGIT7 MAX7219.set.digit
01100110 _DIGIT7 MAX7219.set.digit
01100110 _DIGIT6 MAX7219.set.digit
01100110 _DIGIT6 MAX7219.set.digit
01100110 _DIGIT6 MAX7219.set.digit
01100110 _DIGIT6 MAX7219.set.digit
[ decimal ]
begin key? until
MAX7219.shutdown
SPI.end
;
Code FORTH possible après cette modification:
: test3 ( -- )
init.VSPI
MAX7219.normal
$01 MAX7219.intensity
$07 MAX7219.scan.limit
$00 MAX7219.decode
%01100110 _DIGIT7 MAX7219.set.digit
%01100110 _DIGIT7 MAX7219.set.digit
%01100110 _DIGIT7 MAX7219.set.digit
%01100110 _DIGIT7 MAX7219.set.digit
%01100110 _DIGIT6 MAX7219.set.digit
%01100110 _DIGIT6 MAX7219.set.digit
%01100110 _DIGIT6 MAX7219.set.digit
%01100110 _DIGIT6 MAX7219.set.digit
begin key? until
MAX7219.shutdown
SPI.end
;
Legal: site web personnel sans commerce / personal site without seling