Section courante

A propos

Section administrative du site

Les premiers pas

Le BCPL est le coeur du système de compilation BCPL. C'est un langage ressemblant beaucoup au vrai CPL mais étant en fait un langage de programmation très simple étant facile à compiler en code efficace. Les principales différences entre BCPL et CPL sont les suivantes :

Syntaxe BCPL

La notation syntaxique utilisée dans ce manuel est essentiellement BNF avec les extensions suivantes :

Syntaxe matérielle

La syntaxe matérielle est la syntaxe d'une implémentation réelle du langage et dépend donc nécessairement de l'implémentation puisqu'elle dépend de l'ensemble de caractères disponible. Pour simplifier la description de toute implémentation de BCPL, une syntaxe canonique a été définie. La représentation canonique d'un programme BCPL consiste en une séquence de symboles de l'ensemble suivant :

Symboles canoniques de la BCPL

Les symboles NUMBER, NAME, STRINGCONST, SECTBRA et SECTKET désignent des éléments composites ayant chacun une séquence de caractères associée.

Conventions matérielles et règles du préprocesseur

Syntaxe canonique

La syntaxe donnée dans cette section définit toutes les constructions légales en BCPL sans spécifier ni les pouvoirs de liaison relatifs ni les règles d'association des opérateurs de commande et d'expression. Celles-ci sont données plus loin dans la page dans les descriptions de chaque construction.

Pour améliorer la lisibilité de la syntaxe, une représentation matérielle des symboles canoniques a été utilisée. Par exemple :

            ( ) [ ] § § sont utilisés pour désigner RBRA RKET SBRA SKET SECTBRA et SECTKET.

E             ::= <name> | <stringconst> } <number> | true | false
              ( E ) | valof <block> | lv E | rv E | E [ E ] | E*[ E ]
              E <diadic op> | ~E | +E | -E | E→ E, E } E < , E >0

<diadic op> ::= * | / | rem | + | - | = | ≠ | < | > | ≥ | lshift + rshift | ∧ | ∨ | ≡
[également, inférieur ou égal et non équivalent ]
<constant> ::= E

D ::= D < and D>0 | <name> [ <namelist> 1- ] = E |
              <name> [ <namelist> 1- ] be <block> |
              <namelist> = E | <name> = vec <constant>
<namelist> ::= <name> <, <name> > 0

C ::= E := E | E[ E ] | E [ ] | goto E | <name> : < C > 1-
              if E do C | unless E do C | while E do C | until E do C |
              C repeat | C repeatwhile E | C repeatuntil E |
              test E then C or C | for <name> = E to E do C |
              break | return | finish | resultis E |
              switchon E into <block> | case <constant> : < C > 1- |
              default : < C >1- | <block>

<block> ::= § C < ; C >0 § | § < let D | <constdef> >1 <; C >0 §

<constdef ::= < manifest | global > § <name> < = | : > <constant>
              < ; <name> < = | : > <constant> > 0 §

Éléments de données

Rvalues, Lvalues et éléments de données

Une RVALUE est un modèle binaire de bits d'une longueur fixe (dépendant de l'implémentation), elle est généralement de la taille d'un mot informatique. Les Rvalues ??peuvent être utilisées pour représenter une variété de types d'objets différents tels que des entiers, des valeurs de vérité, des vecteurs ou des fonctions. Le type d'objet réel représenté est appelé le TYPE de la Rvalue.

Une expression BCPL peut être évaluée pour produire une valeur R, mais son type reste indéfini jusqu'à ce que la valeur R soit utilisée dans un contexte définitif et elle est alors supposée représenter un objet du type requis. Par exemple, dans l'application de fonction suivante :

  1. (B*[i]  f, g) [1, Z[i]]

l'expression (B*[i] → f, g) est évaluée pour produire une valeur R étant ensuite interprétée comme la valeur R d'une fonction puisque l'expression est apparue dans la position d'opérateur d'une application de fonction ; si f et g sont en fait des fonctions n'est pas explicitement vérifié. De même, l'expression B*[i] (étant une application vectorielle) apparaît là où un booléen est attendu et donc sa valeur R est interprétée comme une valeur de vérité.

Il n'y a pas de vérification explicite pour s'assurer qu'il n'y a pas d'incompatibilité de type.

Une LVALUE est un modèle de bits représentant un emplacement d'entreposage contenant une valeur R. Une Lvalue a la même taille qu'une Rvalue et est un type dans BCPL. Il existe un contexte dans lequel une valeur R est interprétée comme une valeur R et c'est comme l'opérande de l'opérateur monadique rv. Par exemple, dans l'expression :

  1. rv f[i]

l'expression f[i] est évaluée pour donner un Rvalue étant ensuite interprétée comme un Lvalue puisqu'elle est l'opérande de rv. L'application de rv sur cette Lvalue donne la Rvalue étant contenue dans l'emplacement représenté (ou référencé) par le Lvalue. Une Lvalue peut être obtenue en appliquant l'opérateur lv à un identifiant, une application vectorielle ou une expression rv.

Un élément de données est composé d'une Lvalue, de la Rvalue référencée et éventuellement d'un identifiant associé. Le terme est utilisé de manière vague pour désigner la Lvalue, la Rvalue ou l'identifiant selon le contexte.

En BCPL, un élément de données peut avoir au plus un identificateur.

La ligne brisée indique l'association sémantique entre un identificateur x et l'emplacement d'entreposage étant représenté par la case ; la flèche continue montre la correspondance entre la Lvalue 001101 et la Rvalue 000101, et la flèche brisée montre la correspondance entre l'identifiant x et la Lvalue 001101.

Il est significatif de dire que la Lvalue de l'élément de données x est le modèle binaire 001101, que la Rvalue de l'élément de données x est le modèle binaire 000101 et que la Lvalue 001101 fait référence à l'élément de données x.

Types

Une Rvalue peut représenter un objet de l'un des types suivants :

Bien que les représentations de modèles de bits de chaque type dépendent de l'implémentation, certaines relations entre les types ne le sont pas :

Cette propriété peut être utilisée pour définir des fonctions et des routines avec un nombre variable de paramètres réels. Dans la définition d'une telle fonction ou routine, il est nécessaire de donner une liste de paramètres formelle qui soit au moins aussi longue que la plus longue liste de paramètres réels de tout appel à celle-ci.

Exemple

La définition suivante :

  1. let R[a, b, c, d, e, f] be
  2.  
  3. § let v = lv a
  4.   . . .
  5.   . . . §

définit la routine R pouvant appelée avec 6 paramètres réels ou moins. Lors de l'exécution de la routine, la variable v peut être utilisée comme un vecteur dont les n premiers éléments sont les n premiers paramètres réels de l'appel ; ainsi lors de l'appel suivant :

  1. R[ 126, 36, 18, 99]

les initiales sont des Rvalues de :

La Rvalue d'une étiquette est un modèle binaire représentant la position du programme de la commande étiquetée. Notez qu'elle ne contient pas d'informations sur le niveau d'activation de la fonction ou de la routine dans laquelle l'étiquette est apparue.

La Rvalue d'une fonction ou d'une routine est une représentation du point d'entrée de la fonction ou de la routine.

Expressions primaires

Noms

Format Description
Forme syntaxique Un nom est une séquence d'un ou plusieurs caractères d'un alphabet restreint appelé alphabet de caractères du nom. La représentation matérielle des caractères de cet alphabet et les règles de reconnaissance des débuts et des fins de noms dépendent de l'implémentation. Une représentation matérielle est la suivante : L'alphabet de caractères du nom contient les lettres A .... Z et a .... z et les chiffres 0 .... 9 et ceux-ci sont tous représentés directement par les mêmes caractères matériels. Un nom commence soit par une lettre majuscule et se termine par la première lettre non-lettre ou le premier chiffre, soit par une seule lettre minuscule.
Sémantique Deux noms sont égaux s'ils ont la même séquence de caractères alphabétiques. Un nom peut toujours être évalué pour produire une Rvalue. Si le nom a été déclaré comme étant une constante manifeste, la Rvalue sera la même à chaque évaluation ; si le nom a été déclaré d'une autre manière, il s'agit d'une variable et sa Rvalue peut être modifiée dynamiquement par une commande d'affectation. Si N est une variable, sa valeur L est la Rvalue de l'expression :

  1. lv N

Constantes de chaîne de caractères

Forme syntaxique :

' <caractère alphabétique de la chaîne de caractères>0 '

La représentation matérielle des caractères dans l'alphabet de chaîne dépend de l'implémentation. Une représentation matérielle est la suivante :

L'alphabet de caractères de chaîne de caractères contient tous les caractères sauf * et ' étant représentés directement. Ces deux exceptions sont représentées par :

De plus :

Caractère Description
*n Représente une nouvelle ligne
*s Représente un espace
*b Représente un retour arrière
*t Représente une tabulation

Sémantique : Une constante de chaîne de caractères de longueur 1 a une Rvalue étant la représentation du motif binaire du caractère; elle est justifiée à droite et remplie de zéros.

Une constante de chaîne de caractères de longueur autre que 1 est représentée comme un vecteur BCPL ; la longueur et les caractères de la chaîne de caractères sont regroupés dans des mots successifs du vecteur.

Exemple : Si les caractères sont regroupés à 4 par mot, alors la chaîne de caractères :

  1. 'Abc10*n'

Rvalue pointant vers la boîte avec 6, 'A', 'b', 'c', '1', '0', '*n', 0.

Constantes numériques

Forme syntaxique :

<chiffre>1 ou 8 <chiffre>1

Sémantique : La séquence de chiffres est interprétée comme un entier décimal dans le premier cas, et comme un nombre octal justifié à droite dans le second.

True et false

Forme syntaxique :

true ou false

Sémantique : La Rvalue de true est un modèle binaire entièrement composé de uns ; la Rvalue de false est zéro. Notez que :

  1. true = ~ false

Expressions entre crochets

Forme syntaxique :

( E )

Sémantique : Les parenthèses peuvent entourer n'importe quelle expression ; leur seul but est de spécifier le regroupement.

Blocs de résultats

Forme syntaxique :

valof <block>

Sémantique : Un bloc de résultats est une forme d'expression BCPL ; il est évalué en exécutant le bloc jusqu'à ce qu'une instruction resultis soit rencontrée, ce qui provoque l'arrêt de l'exécution du bloc et renvoie la valeur de l'expression dans la commande resultis.

Applications vectorielles

Forme syntaxique :

E1 * [ E2 ]

L'astérisque est nécessaire pour distinguer une application vectorielle d'une application fonctionnelle. E1 est une expression primaire.

Sémantique : Un vecteur est représenté par un pointeur vers un groupe consécutif de mots étant les éléments du vecteur. Le pointeur pointe vers le zéroième élément. Pour évaluer une application vectorielle, E1 et E2 sont évalués pour produire deux Rvalue, la première est interprétée comme un pointeur de vecteur et la seconde comme l'indice ; l'élément est ensuite consulté pour produire le résultat.

La Lvalue d'un élément peut être obtenue en évaluant l'expression :

lv E1 * [ E2 ]

Les représentations des vecteurs, des Lvalues et des entiers sont telles que les relations suivantes sont vraies :

  1. E1*[E2] = rv (E1+E2)
  2. lv E1 * [ E2 ] = E1 + E2

Applications de la fonction

Forme syntaxique :

E1 [ E2, E3, ... En ]

E1 est une expression primaire.

Sémantique : L'application de la fonction est évaluée en évaluant les expressions E1, E2 ... En et en affectant les Rvalues de E2 ... En aux n-1 premiers paramètres formels de la fonction dont la Rvalue est la valeur de E1 ; cette fonction est alors saisie. Le résultat de l'application est la Rvalue de l'expression dans la définition de la fonction.

Expressions Lv

Forme syntaxique :

lv E

E est une expression primaire.

Sémantique : La Lvalue de certaines expressions peut être obtenue en appliquant l'opérateur lv ; il n'est utile d'appliquer lv qu'à une application vectorielle, une expression rv ou un identifiant qui n'est pas une constante manifeste.

Le résultat de l'application dépend de l'opérateur principal de l'opérande comme suit :

Expressions Rv

Forme syntaxique :

rv E

E est une expression primaire.

Sémantique : La valeur d'une expression rv est obtenue en évaluant son opérande pour produire un Rvalue étant ensuite interprétée comme la Lvalue d'un élément de données. Le résultat est la Rvalue de cet élément de données.

Expressions composées

Expressions arithmétiques

Forme syntaxique :

E1 * E2 ou E1 / E2 ou E1 rem E2 ou E1 + E2 ou +E1 ou E1-E2 ou -E1

Les opérateurs * / et rem sont plus contraignants que + et - et s'associent à droite. Les opérateurs + et - s'associent à gauche.

Sémantique : Tous ces opérateurs interprètent les Rvalue de leurs opérandes comme des entiers signés et tous donnent des résultats entiers.

L'opérateur * désigne la multiplication d'entiers.

L'opérateur de division / donne le résultat correct de la division de E1 par E2 si E1 est divisible par E2 ; il dépend sinon de l'implémentation mais l'erreur d'arrondi n'est jamais supérieure à 1.

L'opérateur rem donne le reste de E1 divisé par E2 ; sa spécification exacte dépend de l'implémentation.

Les opérateurs + et - s'expliquent d'eux-mêmes.

Expressions relationnelles

Forme syntaxique :

E1 <relop> E2 .... <relop> En
où <relop> ::= = | ≠ | < | > | ≤ | >=
et n >= 2

L'absence de caractère réel >= est un problème de police de caractères.

Les opérateurs relationnels sont moins contraignants que les opérateurs arithmétiques.

Sémantique : Le résultat de l'évaluation d'une relation étendue est vrai si et seulement si toutes les relations individuelles sont vraies. L'ordre d'évaluation est indéfini. Les Rvalue des expressions E1 ... En sont interprétées comme des entiers signés et les opérateurs relationnels ont leur signification mathématique habituelle.

Expressions de décalage

Forme syntaxique :

E1 lshift E2 ou E1 rshift E2

E2 est une expression primaire ou arithmétique et E1 est une expression primaire, relationnelle, arithmétique ou de décalage. Ainsi, les opérateurs de décalage sont moins contraignants que les relations à gauche et plus contraignants à droite.

Sémantique : La Rvalue de E1 est interprétée comme un motif binaire logique et celle de E2 comme un entier. Le résultat de «E1 lshift E2» est le motif binaire E1 décalé vers la gauche de E2 positions. «E1 rshift E2» est comme pour lshift mais se décale vers la droite. Les positions vacantes sont remplies de zéros et le résultat est indéfini si E2 est négatif ou supérieur à la taille de l'élément de données.

Expressions logiques

Forme syntaxique :

~ E1 ou E1 E2 ou El E2 ou E1 E2 ou E1 NEQV E2

Note  NEQV était une triple barre croisée.

L'opérateur ~ est le plus contraignant ; alors, par ordre décroissant de pouvoir contraignant, on trouve :

Tous les opérateurs logiques sont moins contraignants que les opérateurs de décalage.

Sémantique : Les opérandes de tous les opérateurs logiques sont interprétés comme des motifs binaires de uns et de zéros.

L'application de l'opérateur ~ donne la négation logique de son opérande. Le résultat de l'application de tout autre opérateur logique est un motif binaire dont le n-ième bit ne dépend que des n-ièmes bits des opérandes et peut être déterminé par le tableau suivant.

Les valeurs de Opérateur
n-ième bits NEQV
les deux 1 1 1 0
les deux zéros 0 0 1 0
autrement 0 1 0 1

Expressions conditionnelles

Forme syntaxique :

El → E2, E3

E1, E2 et E3 peuvent être n'importe quelles expressions logiques ou des expressions ayant un pouvoir de liaison supérieur. E2 et E3 peuvent, en outre, être des expressions conditionnelles.

Sémantique : La valeur de l'expression conditionnelle E1 → E2, E3 est la valeur R de E2 ou E3 selon que la valeur de E1 représente respectivement vrai ou faux. Dans les deux cas, une seule alternative est évaluée. Si la valeur de E1 ne représente ni vrai ni faux, le résultat de l'expression conditionnelle est indéfini.

Commandes

Commandes d'affectation

Forme syntaxique :

L1, L2, ... Ln := R1, R2, ... Rn

Sémantique : La sémantique de la commande d'affectation est définie en termes de commande d'affectation simple ; la commande donnée ci-dessus est sémantiquement équivalente à la séquence suivante :

L1 := R1
L2 := R2
. . . .
Ln := Rn

Notez que les tâches individuelles sont exécutées de gauche à droite et non simultanément.

Commandes d'affectation simples

Forme syntaxique :

E1 : E2

Sémantique : E1 peut être soit un identifiant, soit une application vectorielle, soit une expression rv, et son effet est le suivant :

Commandes de routine

Forme syntaxique :

E1[ E2, E3, ... En]

E1 est une expression primaire.

Sémantique : La commande ci-dessus est exécutée en affectant les Rvalues ??de E2, E3, ... , En aux n-1 premiers paramètres formels de la routine dont la Rvalue est la valeur de E1 ; cette routine est alors saisie. L'exécution de cette commande est terminée lorsque l'exécution du corps de la routine est terminée.

Commandes d'étiquettes

Forme syntaxique :

N: C

où N est un nom.

Sémantique : Ceci déclare un élément de données avec le nom N ; sa portée est le plus petit corps de routine ou bloc de résultat englobant textuellement et sa Rvalue initiale est un motif binaire représentant la position du programme de la commande C. Sa Lvalue est une constante manifeste et fait référence à une position dans le vecteur global si et seulement si la commande étiquetée se produit dans la portée d'un global avec le même nom que l'étiquette. La Rvalue d'une étiquette est initialisée avant l'exécution du programme.

Commande goto

Forme syntaxique :

goto E

Sémantique : E est évalué pour produire une Rvalue, puis l'exécution est reprise à l'instruction dont l'étiquette avait la même Rvalue initiale.

Commande if

Forme syntaxique :

if E do C

Sémantique : E est évalué pour produire une Rvalue étant ensuite interprétée comme une valeur de vérité. Dans BCPL, false est représenté par zéro et true par le complément de false :

  1. ~ false

Si la valeur de E représente false alors la commande C n'est pas exécutée ; si elle représente true alors elle est exécutée et si elle ne représente ni true ni false alors l'effet dépend de l'implémentation.

Commande unless

Forme syntaxique :

unless E do C

Sémantique : Cette affirmation est exactement équivalente à la suivante :

  1. if ~ ( E ) do C

Commande while

Forme syntaxique :

while E do C

Sémantique : Ceci est équivalent à la séquence suivante :

goto L
M: C
L: if E goto M

L et M sont des identifiants n'apparaissant pas ailleurs dans le programme.

Commande until

Forme syntaxique :

until E do C

Sémantique : Cette affirmation est équivalente à :

while ~ ( E ) do C

Commande test

Forme syntaxique :

test B then C1 or C2

Sémantique : Cette instruction est équivalente à la séquence suivante :

if ~ (E) goto L
C1
goto M
L: C2
M:

où L et M sont des identificateurs n'apparaissant pas ailleurs dans le programme.

Commande repeat

Forme syntaxique :

C repeat ou
C repeatwhile E ou
C repeatuntil E

C est une commande autre qu'une commande if, unless, until, while, test ou for.

Sémantique : C repeat est équivalent à :

L: C
goto L
C repeatwhile E est équivalent à :
L: C
if E goto L
C repeatuntil B est équivalent à :
L: C
if ~ ( E ) goto L

où L est un identifiant qui n'apparaît pas ailleurs dans le programme.

Commande for

Forme syntaxique :

for N = E1 to E2 do C

où N est un nom.

Sémantique : L'énoncé ci-dessus est équivalent à :

§ let N=E1
until N > E2 do
§ C
N := N+1 § §

Commande break

Forme syntaxique :

break

Sémantique : Lorsque cette instruction est exécutée, elle entraîne la reprise de l'exécution au point juste après la plus petite commande de boucle englobante textuellement. Les commandes de boucle sont celles qui contiennent les mots clefs suivants : until, while, repeat, repeatwhile, repeatuntil et for.

Commande finish

Forme syntaxique :

finish

Sémantique : Cela provoque l'arrêt de l'exécution du programme.

Commande return

Forme syntaxique :

return

Sémantique : Cela provoque un retour d'un corps de routine au point juste après la commande de routine ayant effectué l'appel de routine.

Commande Resultis

Forme syntaxique :

resultis E

Sémantique : Cela provoque l'arrêt de l'exécution du plus petit bloc de résultats englobant et renvoie la valeur R de E.

Commande switchon

Forme syntaxique :

switchon E into block

où le bloc contient des étiquettes de la forme :

case constant : ou
default :

Sémantique : L'expression est d'abord évaluée, puis si un cas existe ayant une constante avec la même valeur, l'exécution reprend à cette étiquette ; sinon, s'il existe un étiquette par défaut, l'exécution continue à partir de là ; sinon, l'exécution reprend juste après la fin de la commande switchon. Le commutateur est implémenté comme un commutateur direct, une recherche séquentielle ou un commutateur de hachage en fonction du nombre et de l'intervalle des constantes de cas.

Blocs

Forme syntaxique :

§ C < ; C > 0 § ou
§ < let D | <constdef> > 1 .< ; C >0 §

Sémantique : Un bloc est exécuté en exécutant les déclarations (le cas échéant) en séquence, puis en exécutant les commandes du bloc. La portée de la définition d'une déclaration est la région du programme constituée de la déclaration elle-même, des déclarations suivantes et de la séquence de commandes.

Définitions

Règles de portée

La portée d'un nom N est la région textuelle du programme dans laquelle N fait référence au même élément de données. Chaque occurrence d'un nom doit être dans la portée d'une déclaration du même nom.

Il existe trois types de déclaration :

Deux éléments de données sont dits déclarés au même niveau de définition s'ils ont été déclarés dans la même liste de paramètres formels, comme étiquettes de la même routine ou du même bloc de résultats, ou dans la même définition.

Il existe trois restrictions sémantiques concernant les règles de portée ; ce sont :

Allocation d'espace et étendue des éléments de données

L'étendue d'un élément de données est la durée pendant laquelle il existe et a une Lvalue.

Tout au long de l'étendue d'un élément de données, sa Lvalue reste constante et sa Rvalue n'est modifiée que par affectation.

Dans BCPL, les éléments de données peuvent être divisés en deux classes :

Un élément de données est initialisé au plus une fois au début de son étendue ; les éléments de données statiques sont initialisés avant l'exécution du programme et un élément de données dynamiques au moment où sa déclaration est exécutée. Les éléments de données statiques et dynamiques peuvent avoir leurs Rvalue modifiées par affectation.

Pendant l'exécution d'une fonction ou d'une routine récursive, une seule déclaration de texture peut donner lieu à plusieurs activations de sa définition. Les seules déclarations pouvant donner lieu à plusieurs activations sont celles déclarant des éléments de données dynamiques, à savoir :

Déclarations globales

Forme syntaxique :

global § <name> : <constant>
< ; <name> : <constant> > 0~ §

Sémantique : Le vecteur global est le seul moyen de communication entre les segments compilés séparément d'un programme. Pour appeler une fonction ou une routine déclarée dans un segment à partir d'une position dans un autre, il est nécessaire de la déclarer comme globale dans chacun des deux segments.

La déclaration ci-dessus déclare un ensemble de noms comme étant global et alloue les positions dans le vecteur global comme défini par les constantes manifestes. Une variable globale est un élément de données statique et possède une Lvalue étant une constante manifeste.

Déclarations manifestes

Forme syntaxique :

manifest § <name> = <constant>
< ; <name> = <constant> > 0 §

Sémantique : cette déclaration déclare que chaque nom est une constante manifeste avec une valeur égale à la valeur de son expression constante associée. La signification d'un programme resterait inchangée si toutes les occurrences de constantes nommées manifestes étaient remplacées textuellement par leurs valeurs correspondantes.

Cette fonctionnalité a été fournie pour améliorer la lisibilité des programmes et pour donner au programmeur une plus grande flexibilité dans le choix des représentations internes des données.

Définitions simples

Forme syntaxique :

N1, N2, ... Nn = E1, E2, ... En

Sémantique : Les éléments de données portant les noms N1 ... Nn sont d'abord déclarés, mais pas initialisés, puis la commande d'affectation suivante est exécutée :

N1, N2, ... Nn :=E1, E2, ... En

Une définition simple déclare des éléments de données dynamiques.

Définitions vectorielles

Forme syntaxique :

N = vec constant

où N est un nom.

Sémantique : la valeur de l'expression constante doit être une constante manifeste et elle définit la valeur d'indice maximale autorisée du vecteur N. La valeur d'indice minimale est toujours zéro. La Rvalue initiale de N est la valeur L du zéroième élément du vecteur ; N et les éléments du vecteur sont tous deux des éléments de données dynamiques.

Définitions de fonctions

Forme syntaxique :

N [ <namelist>1- ] = E

N est un nom.

Sémantique : Ceci définit une fonction avec le nom N ; l'élément de données défini est statique et sa Rvalue est initialisée avant l'exécution du programme. La valeur L de N est une constante manifeste et fait référence à une position dans le vecteur global si et seulement si la définition de fonction est dans la portée d'une définition globale du même nom.

Les noms dans la liste de noms sont appelés paramètres formels et leur portée est le corps de la fonction E. L'étendue d'un paramètre formel dure depuis le moment de son initialisation dans un appel jusqu'au moment où l'évaluation du corps est terminée.

Toutes les fonctions et routines peuvent être définies et utilisées de manière récursive.

Définitions de routine

Forme syntaxique :

N [ <namelist> 1- ] be <block>

N est un nom.

Sémantique : Ceci définit une routine avec le nom N. La sémantique d'une définition de routine est exactement la même que celle d'une définition de fonction, sauf que le corps d'une routine est un bloc et que son application ne donne donc aucun résultat. Une routine ne doit donc être appelée que dans le contexte d'une commande.

Définitions simultanées

Forme syntaxique :

D < et D > 0

Sémantique : Toutes les définitions sont effectivement exécutées simultanément et tous les éléments de données définis ont la même portée qui, selon les règles de portée, inclut la définition simultanée elle-même ; un ensemble de fonctions et de routines mutuellement récursives peut ainsi être déclaré.



Dernière mise à jour : Mardi, le 26 novembre 2024