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
Remplit avec des caractères 'espace' une chaîne explicite ou une zone mémoire
de long octets débutant à l'adresse 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
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.
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.
Convertit un caractère alphabétique minuscule en majuscule. Exemple:
ASCII a UPC EMIT affiche 'A'
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.
Constante délivrant le nombre de listes chaînées séparées par vocabulaire.
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.
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
Variable système pointant le vocabulaire courant. Le vocabulaire courant est
celui où sont ajoutées les nouvelles définitions.
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.
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> ! ;
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
Variable dont le contenu correspond à une adresse du dictionnaire en dessous
de laquelle une définition ne peut plus être supprimée par FORGET.
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.
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.
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 ?...)
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
Transforme l'adresse du champ de code (cfa) en adresse de champ du nom (nfa).
Transforme le champ d'exécution d'un mot (cfa) en son champ de "vue".
Convertit l'adresse du champ paramétrique d'un mot en celle de son champ de
code.
Délivre l'adresse du champ du nom à partir de l'adresse du champ de lien.
Transforme l'adresse du champ de lien en adresse de compilation.
Convertit l'adresse du champ du nom en adresse du champ de lien.
Convertit l'adresse du champ du nom en adresse d'exécution.
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.
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>.
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.
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.
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.
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
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
Affiche le contenu d'une variable de 16 bits. Est équivalent à la séquence @
. . Exemple
VARIABLE SCORE 10 SCORE !
SCORE ?
Affiche 10
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.
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.
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.
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.
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.
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
Affichage du nombre double précision d dans la base numérique courante.
Exemple.
33. D.
affiche 33
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
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
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
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
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
Sélectionne la base numérique octale. Mot destiné aux nostalgiques des IBM
ancienne série.
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 ?)
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)
Affichage d'un nombre double précision (32 bits) en valeur absolue. Exemple:
55. UD. affiche 55
-1. UD. affiche 4294967295
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.
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).
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
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 #.
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
Variable contenant le nombre de digits dans le tampon de formatage. Est initialisé
par <# et incrémenté par #, #S, HOLD et SIGN.
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
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 --