Reconnaitre les nombres binaires et décimaux

publication: 30 avril 2024 / mis à jour 30 avril 2024

Read this page in english

 

La version actuelle d'ESP32forth accepte la saisie de nombres sous deux formes :

Je propose que le mécanisme permettant la saisie explicite dans une base numérique spécifique soit étendu :

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