Cours Apl 04
Premières fonctions primitives et manipulations d'objets
L'affectation : ←
Cette fonction permet d'affecter la valeur de l'argument droit à l'objet de gauche.Exemple : pour donner la valeur 35 à la variable dpt on procède comme suit :
dpt ← 35L'affectation étant une fonction comme les autres, on peut la placer où bon nous semble, et plusieurs fois si nécessaire, sur la même ligne.
Exemple :
total ← +/liste ← 2 3 5Attention !!!Si plusieurs instructions sont placées sur la même ligne, apl commence par effectuer le groupe le plus à droite, puis en passe le résultat à la fonction immédiatement à sa gauche.
Dans ce cas, Apl a
- d'abord affecté 2 3 5 à liste
- puis il en a calculé la somme "+/"
- enfin, " ← " l'a affectée à total.
De même, il est courant d'initialiser plusieurs variables en une ligne.
Ainsi au lieu d'écrire :
v1 ← 0 v2 ← 0 v3 ← 0on écrira :
v1 ← v2 ← v3 ← 0
Affectation en modification
Cette syntaxe est utilisée lorsqu'on réaffecte à une variable son contenu modifié.Variable fonction ← argument
Exemple : au lieu d'écrire a ← a × 2
on peut écrire a × ← 2
ce qui signifie : a reçoit lui même multiplié par 2.
Tailles et dimensions des variables
Comme nous l'avons déjà aperçu au chapitre 3, la principale fonction de gestion des tailles est le ⍴(rhô).En mode monadique, elle rend la taille de l'objet, ou plus exactement le vecteur de ses dimensions.
Par exemple : ⍴ 'coucou'
rend 6, qui est un vecteur de 1 élément.
Ainsi, ⍴⍴ 'coucou'
rendra 1
Il est donc très facile de savoir quel type d'objet on manipule (scalaire, vecteur, matrice , ...).
En mode dyadique, la fonction ⍴ rend un objet dont la dimension est définie à gauche, et dont le contenu est défini à droite.
Exemple : 2 3 ⍴ 1 2 3 4 5 6
rend cette matrice numérique :
1 2 3 4 5 6Affectons cette expression à m1 :
m1 ← 2 3 ⍴ 1 2 3 4 5 6D'après vous, quel sera le résultat de
(⍴ m1)⍴ 0On obtient une nouvelle matrice de même taille que m1 remplie de 0.
Pour constituer l'objet de dimension G (argument gauche), ← boucle sur D pour remplir le nouvel objet.
Ainsi, pour constituer cette matrice :
abcd abcd abcdil suffit d'écrire : 3 4 ⍴ 'abcd'
Si le rhô permet d'allonger les objets, il permet également de les raccourcir.
Ainsi
3 ⍴ 1 2 3 4 5 donne 1 2 3
Fonctions voisines : take et drop
Le ↑ (take) peut également augmenter ou diminuer les tailles des objets mais ne peut pas modifier leur nombre de dimensions.Par exemple
2 3 ⍴ 4 5 6 produit cette matrice : 4 5 6 4 5 6En revanche 2 3 ↑ 4 5 6 produira un "Rank Error". En effet, 4 5 6 est un vecteur (objet de rang 1) et 2 3 indique les dimensions d'une matrice. Or, take ne peut pas changer le rang d'un objet, mais seulement ses dimensions, sans en changer le nombre.
Soit Mat1 ← 4 4 ⍴ 1 2 3
Mat vaut :
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 ↑ Mat1 donne 1 2 3 2 3 1Dans cet exemple, on ne garde que les 2 premières lignes et les 3 premières colonnes de Mat1.
Si on signe négativement l'argument gauche, take prend alors les n derniers éléments.
Exemple
¯3 ↑ 1 2 3 4 5 rend 3 4 5↓ (Drop), quant à lui, abandonne le nombre d'élément indiqué à gauche.
Par exemple
1 1 ↓ Mat1 rend : 3 1 2 1 2 3 2 3 1on a abandonné la 1ère ligne et la 1ère colonne.
On obtiendrait le même résultat avec
-3 -3 ↑ Mat1