L'INTERPRETEUR

A. INTERFACE CHAINES DU SYSTEME.

-TRAILING adr long1 --- adr long2 F83
Renvoie les paramètres d'une chaîne de caractères, à savoir l'adresse et la longueur, après avoir supprimé les espaces superflus situés en fin de chaîne. Exemple:
: TITRE " MENU GENERAL       " ;
TITRE TYPE                  affiche  MENU GENERAL        OK
TITRE -TRAILING TYPE        affiche  MENU GENERAL OK

BLANK adr long --- F83
Remplit avec des caractères 'espace' une chaîne explicite ou une zone mémoire de long octets débutant à l'adresse adr.

CAPS --- adr
Variable dont le contenu permet le contrôle de la conversion des caractères alphabétiques minuscules en caractères majuscules. La conversion a lieu si son contenu est 'vrai', c'est à dire égal à moins un. Ainsi, en exécutant la séquence -1 CAPS !, ou mieux CAPS ON, vous pourrez taper indifféremment vos définitions en caractères minuscules ou majuscules, le système se chargeant de la conversion.

CAPS-COMP adr1 adr2 long --- -1 ou 0 ou 1
Compare deux chaînes de caractères en ne tenant pas compte des différences majuscules/minuscules. Chaque caractère minuscule est converti en caractère majuscule avant la comparaison de chaîne. Ainsi, les caractères 'a' et 'A' sont considérés comme étant identiques. Exemple:
: TEST  ( ---)
" VACHE" DROP " vache" CAPS-COMP .  ;
  affiche 0
Les chaînes "VACHE" et "vache" sont identiques.

COMP adr1 adr2 long --- -1 ou 0 ou 1
Réalise une comparaison de chaînes de caractères commençant à adr1 et adr2, ceci sur n caractères. Si les deux chaînes sont égales, le résultat du test est nul. Si les deux chaînes sont différentes, le résultat est -1 ou 1. Si c'est -1 qui est renvoyé, la chaîne 1 est inférieure à la chaîne 2. Si c'est 1 qui est renvoyé, la chaîne 1 est supérieure à la chaîne 2. Exemples:
: TEST1  " VACHE" DROP  " VACCIN" DROP 3 COMP .  ;
  TEST1   affiche    0
: TEST2  " VACHE" DROP  " VACCIN" DROP 4 COMP .  ;
  TEST2   affiche    1
Toutes les comparaisons sont relatives au jeu de caractères ASCII. La comparaison tient d-ment compte des différences entre caractères majuscules et minuscules.

COMPARE adr1 adr2 long --- -1 ou 0 ou 1
Compare deux chaînes de caractères. Si le contenu de la variable CAPS est vrai (égal à -1), les caractères des deux chaînes sont convertis en majuscules avant comparaison. Exemple:
: TEST1
0 CAPS !  " VACHE" DROP  " vache" COMPARE . ;
: TEST2    
1 CAPS !  " VACHE" DROP  " vache" COMPARE . ;
TEST1   affiche 0
TEST2  affiche -1

COUNT adr --- adr+1 long F83
Transforme une chaîne de caractères implicite en une chaîne de caractère explicite. Exemple:
: ECRIS  BL WORD  COUNT  TYPE  ;
ECRIS TEST   affiche  TEST
Le mot COUNT incrémente une adresse et délivre son contenu. Ses utilisations peuvent donc dépasser le traitement des chaînes de caractères. Exemple:
: PETIT-DUMP  ( adr nb ---)
0 DO COUNT . LOOP DROP ;
16384  10  PETIT-DUMP

affiche les contenus de 10 emplacements mémoire à partir de 16384

ERASE adr long --- F83
Remplit avec le caractère "nul" (code ASCII 0) une chaîne explicite ou une zone de mémoire débutant à l'adresse adr et de longueur long.

FILL adr n c ---
Remplit une zone mémoire de n octets de longueur commençant à l'adresse adr avec le caractère de code c.

LENGTH adr --- adr+2 long
Convertit l'adresse de chaîne de caractère en adresse de début de la chaîne et sa longueur, ceci pour les longues chaînes de caractères dont la longueur est définie sur 16 bits. Son équivalent est COUNT pour les chaînes dont la longueur est définie sur 8 bits.

UPC c --- c
Convertit un caractère alphabétique minuscule en majuscule. Exemple:
ASCII a UPC EMIT       affiche     'A'

UPPER adr long ---
Transforme tous les caractères minuscules contenus dans la chaîne de caractères pointés par adr et long en caractères majuscules.
: TEST " ceci est un test"  ;
TEST TYPE         affiche    ceci est un test
TEST UPPER 
TEST TYPE         affiche    CECI EST UN TEST
Si vous désirez conserver un original de la chaîne en caractères minuscules, assurez-vous d'abord de la sauvegarder avant conversion des caractères.


B. POINTEURS ET CONTROLE DU DICTIONNAIRE.

#THREADS --- n
Constante délivrant le nombre de listes chaînées séparées par vocabulaire.

#VOCS --- n
Constante dont le contenu indique le nombre d'éléments dans la zone d'indication de l'ordre de recherche. Cette valeur est initialisée à cinq unités.

(FORGET) adr-code adr-lien-relatif ---
Oublie une partie du dictionnaire. Les deux adresses, celle de code et celle d'en-tête sont spécifiées et sont indépendantes. Le mot (FORGET) réinitialise les liens et restitue l'espace mémoire. Ce mot est utilisé dans la définition de FORGET.

CONTEXT --- adr F83
Pointeur du vocabulaire de contexte, c'est à dire du vocabulaire dans lequel doivent s'effectuer les recherches de mots. CONTEXT délivre l'adresse d'une table ordonnée pouvant contenir cinq vocabulaires de recherche (voir #VOCS). Si la recherche est infructueuse dans le premier vocabulaire pointé, la recherche se poursuit dans le vocabulaire suivant de la table. Un vocabulaire est pointé par le pfa du nom-de-vocabulaire qui le définit. Celui-ci pointe à son tour le champ de lien (lfa) du plus récent mot de ce vocabulaire. Exemple:
CONTEXT  @ BODY>  >NAME  .ID
\ affiche le nom du premier vocabulaire de recherche
CONTEXT  @ @  L>NAME  .ID
\ affiche le premier mot rencontré lors d'une recherche

CURRENT --- adr
Variable système pointant le vocabulaire courant. Le vocabulaire courant est celui où sont ajoutées les nouvelles définitions.

DP --- adr F83
Variable système Dictionnaire-Pointeur contenant l'adresse de la première cellule libre située au sommet du dictionnaire. Le contenu de DP est fréquemment utilisé et est délivré par HERE.

HASH adr1 adr2 --- adr3
Détermine dans quel brin de vocabulaire un mot doit être compilé ou recherché. C'est l'opérateur de "hashage" qui permet à chaque vocabulaire d'être tissé en quatre brins indépendants. Le nombre de brins (4) est déterminé par #THREADS.

Dans chaque vocabulaire, les mots sont liés les uns aux autres dans l'un seulement des 4 brins entremêlés tout au long du vocabulaire. Le champ paramètre du nom de vocabulaire contient quatre cellules pointant le lfa de chaque tête de brin. Il suffit de savoir dans quel brin doit se situer un mot pour réduire les recherches au quart seulement des mots du vocabulaire. On comprend l'intérêt du dispositif pour accélérer les compilations. Le brin dans lequel doit se situer un mot est déterminé par la première lettre de ce mot, plus précisément par les deux bits de poids faible du premier caractère (00, 01, 10, 11, ce qui donne bien quatre possibilités).

Ainsi, dans un vocabulaire, les mots commençant par un A ou un E ou un I (AEIMQU) ou ceux par (BFJNRV) sont dans un même brin.

Adr1 étant l'adresse d'une chaîne implicite de caractères, adr2 pointant un vocabulaire, adr3 est l'adresse de la tête de brin du vocabulaire concerné par la chaîne donnée.

Evidemment HASH complique assez sérieusement des mots travaillant sur les vocabulaires tels que FIND, WORDS ou FORGET, mais heureusement, ces mots sont déja écrits et fonctionnent très bien, merci! Voici enfin ce que serait une définition de HASH en haut niveau:

: HASH  SWAP 1+  C@  3  AND  2*  +  ;

Voici, pour illustrer HASH, un mot qui 'strappe' dans le vocabulaire courant un mot devenu inutile et encombrant:

FORBID <nom>

frappe <nom> d'interdiction; il ne figure plus dans une liste WORDS et n'est plus exécutable. Sa définition quoique invisible reste toutefois présente et les mots qui l'ont utilisé restent valides, à la différence d'une procédure FORGET. Il est permis d'interdire des mots dans le dictionnaire protégé:

: FORBID
BL WORD  CAPS  @  
IF  DUP COUNT  UPPER  THEN
CURRENT  @  OVER  SWAP
HASH  TUCK  @  (FIND)  0=  ?MISSING
>LINK  SWAP
BEGIN   2DUP  @  =  NOT  WHILE  @  REPEAT
>R  @  R>  !  ;

HERE --- adr F83
Délivre l'adresse du pointeur de dictionnaire, c'est à dire l'adresse du premier emplacement libre dans le dictionnaire. En cas de sauvegarde de votre programme sous forme compilée, c'est cette adresse qui doit être stockée dans la variable FENCE par la séquence HERE FENCE !. Exemple:
HERE U.   \ affiche la valeur actuelle du pointeur de dictionnaire
: TEST ;
HERE U.   \ affiche la nouvelle valeur actuelle du pointeur de dictionnaire

FENCE --- adr
Variable dont le contenu correspond à une adresse du dictionnaire en dessous de laquelle une définition ne peut plus être supprimée par FORGET.

FORGET --- >mot>
Provoque l'oubli de >mot> ainsi que de toutes les autres définitions définies après >mot>. Exemple:
: MOT1 ;    : MOT2 ;    : MOT3 ;
FORGET MOT2    détruit MOT2 et MOT3 du dictionnaire.

PAD --- adr
Délivre l'adresse d'une zone de stockage temporaire pour des chaînes de caractères. Exemple:
PAD 80 EXPECT
PAD 80 TYPE 

affiche la chaîne précédemment tapée.

Le PAD a une position qui varie dans la mémoire avec la taille du dictionnaire, c'est dire l'importance que vous devez donner au mot temporaire.


C. POINTEURS DU VOCABULAIRE DANS LE DICTIONNAIRE.

>BODY adr1 --- adr2 F83
Convertit l'adresse du code exécutif d'un mot (cfa) en celle de son champ paramétrique (pfa). Exemple, changer la valeur d'une constante:
5 CONSTANT CINQ
6 ' CINQ >BODY !
CINQ .

affiche désormais 6 (étonnant non ?...)

>LINK adr1 --- adr2
Convertit l'adresse du code exécutif (cfa) d'un mot en celle de son champ de lien (lfa). Exemple:
: MOT1 ;    : MOT2 ;
' MOT2 >LINK @ .ID   affiche MOT1

>NAME cfa --- nfa
Transforme l'adresse du champ de code (cfa) en adresse de champ du nom (nfa).

>VIEW cfa --- vfa
Transforme le champ d'exécution d'un mot (cfa) en son champ de "vue".

BODY> pfa --- cfa F83
Convertit l'adresse du champ paramétrique d'un mot en celle de son champ de code.

L>NAME lfa --- nfa
Délivre l'adresse du champ du nom à partir de l'adresse du champ de lien.

LINK> lfa --- cfa
Transforme l'adresse du champ de lien en adresse de compilation.

N>LINK nfa --- lfa
Convertit l'adresse du champ du nom en adresse du champ de lien.

NAME> nfa --- cfa
Convertit l'adresse du champ du nom en adresse d'exécution.

VOC-LINK --- adr
Variable dont le contenu pointe sur le vocabulaire le plus récemment défini. L'adresse pointée dans le champ paramètre du nom de vocabulaire pointe elle-même un vocabulaire plus ancien et tous les vocabulaires sont ainsi enfilés jusqu'au vocabulaire FORTH.

Pour rechercher le champ de code d'un mot, c'est à dire son cfa, il faut utiliser le mot ' suivi du mot à analyser. Exemple:

' DUP

empile le cfa de DUP


D. TRAITEMENT DU FLOT D'ENTREE.

$EXECUTE adr long ---
Exécute le contenu d'une chaîne de caractères commençant à l'adresse adr et de longueur long, ceci dans le cas où ce contenu est une suite de mots FORTH. Exemple:
: <mot> ...
... " AUTOEXEC.BAT " PASS
    " PROGRAM EDIT.COM " $EXECUTE
...etc... ;

exécutera le contenu de la chaîne " PROGRAM EDIT.COM " le moment venu lors de l'exécution de la définition du mot >mot>.

>IN --- adr F83
Variable système. Pointeur d'interprétation dans le flot d'entrée. Exemple:
>IN (suivi de 5 espaces) ?

affiche 10, valeur prise par >IN après le point d'interrogation. Les structures de contrôle interprétées modifient la progression linéaire de >IN dans le texte à interpréter.

EXPECT adr long --- F83
Attend du terminal d'entrée l'introduction d'une chaîne de caractères de longueur maximale long rangée à l'adresse adr. Le terminal d'entrée est habituellement le clavier, mais peut être modifié en fonction de la revectorisation de KEY.

L'entrée d'une chaîne est achevée quand tous les caractères attendus sont introduits ou avant ce terme par l'appui d'un retour chariot. Les caractères de contrôle, activés par la table CC et la touche de correction 'delete', sont traités directement en priorité sans enregistrement dans la chaîne. La variable SPAN conserve le nombre de caractères valides réellement entrés. Exemple:

: REPONSE  " NON!"  ;
: TEST  REPONSE  EXPECT  CR  REPONSE  TYPE  ;

L'exécution de TEST et appui sur <return> vous met en attente d'une réponse. Puis essayez C <return> ou Y, <delete>, O, U, I, D, A, <return>. Notez après chaque essai la valeur prise par SPAN en tapant la séquence SPAN ?. Le résultat apparemment toujours incongru à 6 s'explique par le fait que le système a lui-même utilisé entre-temps EXPECT et que vous venez de taper SPAN ? qui fait 6 caractères.

START ---
Mot permettant le chargement et l'exécution d'une chaîne de caractères passée en argument depuis le lancement de TURBO-Forth. Exemple, tapez depuis MSDOS:
TURBO WORDS BYE

lance TURBO, exécute WORDS et quitte TURBO. Certains progiciels, tels dBASE III peuvent exécuter un programme externe. Dans ce cas, vous pouvez exécuter un mot FORTH en lançant TURBO-Forth depuis ce progiciel:

RUN TURBO <mot>      (lancement depuis dBASE III)

E. TRAITEMENT DES VALEURS NUMERIQUES.

. n --- F83
Affiche le nombre entier signé dont la valeur est située au sommet de la pile de données, ceci dans la base numérique courante. Après exécution de ce mot, le nombre n ne figure plus au sommet de la pile. Exemple:
45 .               affiche 45
45 HEX . DECIMAL   affiche 2D
45 OCTAL . DECIMAL affiche 55

.R n1 un2 ---
Affiche le nombre entier n1 dans un champ de un2 caractères avec justification à droite. Si le nombre de caractères à afficher est supérieur à un2, il se produit une condition d'erreur. Exemple:
45  10 .R    affiche            45
-3  10 .R    affiche            -3
175 10 .R    affiche           175

? n ---
Affiche le contenu d'une variable de 16 bits. Est équivalent à la séquence @ . . Exemple
VARIABLE SCORE    10 SCORE !
SCORE ?

Affiche 10

(LIT) --- n
Mot compilé par le mot d'exécution immédiate LITERAL. Ce mot précède une valeur littérale dans une définition compilée. Lors de son exécution,le contenu de l'élément seize bits situé deux octets plus loin est déposé sur la pile de données.

(NUMBER) adr --- d
Convertit la chaîne dont la longueur est pointée par le contenu de adr en un nombre double précision. La chaîne doit se terminer par un caractère 'espace', sinon il se produit une erreur. Ce mot est utilisé par défaut par le mot d'exécution vectorisée NUMBER.

(NUMBER?) adr --- d fl
Convertit la chaîne de caractères pointée par l'adresse adr en un nombre double précision d. Ce mot est utilisé dans la définition du mot NUMBER?. Le flag booléen fl vrai indique si la conversion s'est bien passée.

(U.) u --- adr long
Convertit un nombre entier non signé en une chaîne de caractères. Ce mot est utilisé dans la définition des mots U. et U.R.

(UD.) ud --- adr long
Convertit un nombre double précision non signé en une chaîne de caractères. Ce mot est utilisé dans la définition des mots UD. et UD.R.

B. n ---
Affichage en binaire du nombre n sans altération de la base numérique courante. Exemple:
DECIMAL 10 B.    affiche 101
HEX 0F B.        affiche 1111  et reste en hexadécimal

D. b ---
Affichage du nombre double précision d dans la base numérique courante. Exemple.
33. D.

affiche 33

D.R d n ---
Affichage d'un nombre double précision d signé cadré à droite dans un champ de n caractères. Les caractères les plus à gauche sont remplis avec des espaces s'ils ne contiennent pas de chiffres significatifs. Exemple:
55. 10 D.R    affiche        55
  3. 10 D.R   affiche         3
4315. 10 D.R  affiche      4315

DECIMAL ---
Sélectionne la base numérique décimale. A l'initialisation du système, c'est cette base numérique qui est sélectionnée par défaut. Exemple de conversion hexadécimale-décimale:
HEX  3F   DECIMAL .    affiche 63

DPL --- adr
Variable dont le contenu donne la position du point décimal lors de l'entrée en interprétation d'un nombre double précision. Si le contenu de DPL est égal à -1, le nombre est un entier 16 bits; si le contenu est égal à 0, il s'agit d'un entier 32 bits sans partie décimale; si le contenu est supérieur à zéro, la valeur indique la position du point décimal. Exemple:
3562   DPL  @  .       affiche   -1
3562.  DPL  @  .       affiche    0
35.62  DPL  @  .       affiche    2

H. n ---
Affichage en hexadécimal du nombre n sans altération de la base numérique courante. Exemple:
DECIMAL 10 H.    affiche A
2 BASE ! 11 H.   affiche 3  et reste en binaire

HEX ---
Sélectionne la base numérique hexadécimale. Exemple de conversion hexadécimale-décimale:
: H>D.   DECIMAL D. HEX  ;
HEX  3FC6  H>D.      affiche 16326
C7  H>D.      affiche   199

OCTAL ---
Sélectionne la base numérique octale. Mot destiné aux nostalgiques des IBM ancienne série.

U. u ---
Le nombre u est affiché comme nombre entier non signé, sans sélection d'un format particulier, ceci dans la base numérique courante. Exemple:
3 U.   affiche 3
-1 U.   affiche 65535  ( eh oui, étonnant non ?)

U.R u n ---
Affichage d'un nombre entier simple précision u dans un champ de n espaces, cadré à droite. Les caractères les plus à gauche non significatifs sont remplis avec le caractère 'espace'. Exemple:
10    6 U.R  affiche        10
-4    6 U.R  affiche     65532 (même raison que précédemment)

UD. ud ---
Affichage d'un nombre double précision (32 bits) en valeur absolue. Exemple:
55.  UD.    affiche    55
-1.  UD.    affiche    4294967295

UD.R ud n ---
Affichage d'un nombre double précision (32 bits) en valeur absolue dans un champ de n espaces, cadré à droite. Les chiffres de poids fort non significatifs sont remplis par des caractères 'espace'. Exemple:
-1. 20 UD.R    affiche     4394967295
5. 20 UD.R     affiche              5

F. TRANSFORMATION NUMERIQUE ASCII D'UN NOMBRE.

<# --- F83
Marque le début d'une conversion numérique-ASCII en initialisant l'adresse de construction de la chaîne au niveau du PAD ("bloc-note", voir ce mot).

# ud1 --- ud2 F83
Utilisé pour formater un nombre lors d'une conversion numérique-ASCII. Réalise une conversion binaire-ASCII de un chiffre à partir du reste de la division de ud1 avec le contenu de la variable BASE. La valeur du caractère ASCII ainsi calculée est placée dans un tampon provisoire. Le quotient ud2 résultant de la division de ud1 par le contenu de BASE reste sur la pile. Ce mot s'utilise entre les mots <# et #>. Exemple:
: H.  ( n ---)
HEX  0 <# 4 0 DO # LOOP #>
TYPE SPACE DECIMAL ;

Exemple d'utilisation: 55 H. affiche 0037

#> d --- adr n F83
Termine une conversion numérique-ASCII. Ce mot enlève le nombre double précision d et dépose sur la pile l'adresse de la chaîne formatée ainsi que sa longueur. Ces paramètres sont utilisés par TYPE pour afficher la chaîne, mais ils peuvent également être utilisés à des fin de stockage ou de manipulation de chaînes. Le mot #> est utilisé en fin de séquence de format de la chaîne définie à partir des mots <# et #.

#S ud --- 0 0 F83
Réalise une conversion binaire-ASCII comme le ferait une succession de #, ceci tant que la valeur ud n'est pas nulle. La valeur restant sur la pile est un nombre double précision de valeur nulle. Exemple:
: B.  ( n ---)
2 BASE !
0  <# #S #>  TYPE SPACE 
DECIMAL ;

Exemple d'utilisation: 33 B. affiche 100001

HLD --- adr
Variable contenant le nombre de digits dans le tampon de formatage. Est initialisé par <# et incrémenté par #, #S, HOLD et SIGN.

HOLD c ---
Insère le caractère c lors d'un formatage de chaîne. Exemple, pour bien présenter vos dates:
: .DATE  ( d ---)
<# # # ASCII / HOLD # # ASCII / HOLD # # #> TYPE SPACE ;
et en exécution:
300986. .DATE    affiche  30/09/86

SIGN n --- F83
Si n est négatif, le caractère ASCII - (signe moins) est ajouté à l'affichage du nombre à éditer sous forme de chaîne. S'utilise ordinairement entre <# et #>.

 

 

-- hautdepage -- page d'accueil --