Tuteur pour le langage APL
Retour à la liste des autres tuteurs |
Table (~160 k) du clavier APL |
Table (postscript) de correspondance entre touche et fonction |
|
|
Codification (postscript) latex pour apl.sty |
APL est un langage un peu "spécial" car il utilise des symboles spéciaux,
comme le montre cette table (~160 k) du clavier APL.
On peut utiliser un clavier normal à condition de connaitre la correspondance
entre touche et symbole :
Table (postscript) de correspondance entre
touche du clavier et fonction APL.
Il faut en principe avoir une police de caractères spéciales pour
afficher les symboles APL. On peut aussi utiliser des conventions
de notation, ce que nous ferons ici, à savoir : les fonctions APL
seront écrites en minuscules, les variables en majuscules.
Les versions d'APL que nous utiliserons sont libres d'accès :
Téléchargement et installation sous Dos et Linux.
1. Introduction
APL ne connait que trois instructions :
- l'affectation symbolisée par is
- le branchement symbolisé par goto
- le calcul immédiat (automatiquement affiché)
Les opérateurs classiques (notés + - × ÷) ont 2 modes :
- monadiques (1 argument à droite)
+3 vaut 3 : +T renvoie l' identité de T
-3 vaut ¯3 : -T renvoie l' opposé de T
×3 vaut 1 : ×T renvoie le signe de T
(attention : U*T est U puissance T)
÷3 vaut 0.333... : ÷T renvoie l' inverse de T
- dyadiques (2 arguments, 1 à droite et 1 à gauche)
les arguments peuvent être des tableaux ; un élément
seul est étendu à la taille du tableau
3 + 4 vaut donc 7 et 3 × 1 6 5 vaut 3 18 15
1 - 2 3 vaut donc ¯1 ¯2 (distinguer -1 et ¯1).
L'ordre d'évaluation est de droite à gauche, dès que possible.
Ainsi 3 + 4 × 5 vaut 23 et 4 × 6 + 3 vaut 36 (et non pas 27). En conséquence, il
vaut mieux mettre des parenthèses pour lever toute ambiguité.
2. Opérateurs classiques
Ce sont = > le ne etc. et aussi * | min max ^ et /
Il sont aussi monadiques ou dyadiques.
Les opérateurs logiques renvoient 1 pour vrai, 0 pour faux.
|T renvoie la valeur absolue de T
*N renvoie exp(N)
min V renvoie l'entier inférieur ou égal à V
max X renvoie l'entier supérieur ou égal à X
M|N renvoie N modulo M
U*T renvoie U puissance T (attention : U×T est U multiplié par T)
A min B renvoie le min de A et B
X max Y renvoie le max de X et Y
X^Y renvoie X et Y si X et Y sont booléens
X/Y renvoie les éléments de Y correspondants
aux valeurs 1 de X en même position ;
(0 1 0 1) / (1 2 3 4) renvoie donc 2 4
3. Autres Opérateurs
D'autres opérateurs moins classiques "assurent un max". Ce sont
aussi des opérateurs monadiques ou dyadiques. Les plus simples sont
iota rho / ! ? ,
iota N renvoie les nombres de 1 à N
rho T renvoie la taille de T
f/V exécute l'opération f (en cumul) sur V
!X renvoie factorielle(X) ou gamma(X)
?R renvoie un nombre aléatoire entre 1 et R
,G met le tableau G sous forme d'une liste
M iota N renvoie l'indice de N dans M
U rho T formatte T selon U
A,B concatène A et B
X!Y renvoie C(Y,X), le coefficient du binôme
(ou beta(Y,X))
R?S renvoie R nombres aléatoires entre 1 et S
(sans répétition)
4. Exemples
Expression Résultat
+/ iota N la somme des N premiers entiers
×/ iota N factorielle N
3 4 rho 7 1 2 3 4 car APL "boucle" sur les valeurs fournies.
5 6 7 1
2 3 4 5
(N,N) rho 1, N rho 0 la matrice identité
2=+/0=(iota N)|N 1 si N premier, 0 sinon
1=+/0=(iota min N*.5)|N 1 si N premier, 0 sinon (meilleur)
+/,T le total des éléments du tableau T
(ne pas confondre avec +/T)
M is (+/L) ÷ R is rho L la moyenne M de la liste L
(et R est sa taille)
((+/LxL ÷R)-M*2)*.5 son écart-type
+/(0=(1+ iota (N-2))|N)/1 + iota N-2 la somme des diviseurs propres de N
+/V×W le produit scalaire des vecteurs V et W
^/,V=W 1 si les structures V et W son égales, 0 sinon
+/V=min V nombre d'occurrences du minimum de V
((rho T),1)rho T écriture du vecteur T en colonne
5. Produits internes et externes
L'expression X°.fY renvoie le tableau cartésien des X[i]fY[j].
Ainsi (iota 5) °.× iota 10 donne la table de multiplication de 1, de 2
juqu'à la table de 5 à savoir
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
et (iota N) °.! iota N donne la transposée du triangle de Pascal
de taille N soit, pour N = 5
1 2 3 4 5
0 1 3 6 10
0 0 1 4 10
0 0 0 1 5
0 0 0 0 1
L'expression Xf.gY renvoie un tableau des réductions opérées par
f/X[i]gY[j]. Ainsi M+.×N est le produit des matrices M et N et
(iota N) °.= iota N donne la matrice identité de taille N
+/(iota max/T)°.=T donne les effectifs des modalités de T
(X ^.= Y) / iota (rho Y)[2] donne les numéros des colonnes de Y qui sont égales au vecteur X
6. Compléments
Les tableaux sont accessibles globalement par leur nom ou valeur
par valeur, grâce aux crochets. Permuter les éléments en position
I et J se fait simplement par T[I J] is T[J I]. Si t est une matrice,
(rho T)[1] et son nombre de lignes et (rho T)[2] son nombre de colonnes.
En dyadique, rho force la taille du tableau, quitte à reboucler sur les éléments fournis.
Ainsi 12 rho iota 5 donne 1 2 3 4 5 1 2 3 4 5 1 2.
? N rho R est une construction classique qui génère un vecteur
aléatoire de N nombres pris entre 1 et R avec répétition possible. De meme,
? (L,C) rho R construit une matrice aléatoire de L lignes et C
colonnes dont chaque élément est un nombre pris entre 1 et R (avec répétition possible).
En général, les indices commencent à 1. Toute structure de chiffres
peut servir d'indices. Ainsi : 'PEURS'[2 5 rho 5 3 1 2 4] affiche :
SUPER
SUPER
Les opérateurs Ø mirror... ont un sens évident en monadique.
En dyadique, c'est une autre histoire !
grade donne les numéros de classement de T.
T[grade] donne donc T trié en ordre croissant.
'FORMIDABLE'[ 7 8 6 10 9] vaut donc ABDEL
7. Exercice de révision
Qu'affiche 'Ø.'[1+(mirror iota floor/V) °.le V is 6 2 1 5 ] ?
Réponse :
Ø..Ø
Ø..Ø
Ø..Ø
Ø..Ø
ØØ.Ø
ØØØØ
Explications :
floor/V is 6 2 1 5 est le maximum de V soit 6
iota floor/V est donc 1 2 3 4 5 6
mirror iota floor/V est 6 5 4 3 2 1
mirror iota floor/V °.le V vaut 0 1 1 1
0 1 1 0
0 1 1 0
0 1 1 0
0 0 1 0
0 0 0 0
[1+(mirror iota floor/V °.le V ] vaut 1 2 2 2
1 2 2 1
1 2 2 1
1 2 2 1
1 1 2 1
1 1 1 1
et 'Ø•.'[...] transforme les 1 en Ø •, les 2 en .
8. Fonctions
Une fonction s'édite via defson nom et se définit ligne par ligne.
L'entête defDEMO X ; Y ; I
est considérée comme la ligne 0 de la fonction. Elle indique
- que la fonction s'appelle IDEMO
- qu'il y a un paramètre nommé X
- que Y et I sont deux variables locales
Exemple de démonstration :
defHISTO[quad]•
[0] HISTO V ; MAXV ; IND
[1] lamp (commentaire) fait une fonction de l'expression précédente
[2] MAXV is iota floor /V
[3] IND is 1 + (mirrorMAXV) °.leV
[4] 'Ø•.'[IND]
[5] lamp pas d'affectation, donc affichage
def
Une fonction à résultat explicite se définit par Z is EXPLICITE X ; Y ; I
au lieu de IMPLICITE X ; Y ; I
Il faut alors que Z soit affecté dans la fonction. On peut alors
appeler une fonction dans une autre. L'histogramme devient :
def HISTO_AVEC_APPEL[•] ì
[0] HISTO_AVEC_APPEL V ; MAXV ; IND
[1] MAXV is MAXIMUM_DE V
[2] IND is 1+(mirrorMAXV) °.leV
[3] 'Ø•.'[IND]
def
où la fonction MAXIMUM_DE est définie par
def MAXIMUM_DE[def]
[0] S is MAXIMUM_DE VECTEUR
[1] S is floor/ VECTEUR
def
La lecture explicite au clavier de X se fait par X is quad.
Pour sortir nombre et caractère ensemble, il faut convertir les
nombres avec l'opérateur format, symbole fmt
10. Traduction des algorithmes
Les tests et boucles se font via le branchement ; les labels
sont repérés par le symbole : goto De plus, on peut traduire
SI <cond> ALORS { une expression } par un exec (exécute conditionnel).
Par exemple
si N = 0
alors x <-- 1
sinon x <-- 1 / N
finsi
devient
goto (N df 0) / SINON
X is 1
goto FINSI
SINON: X is ÷N
FINSI:
quoiqu'ici, il aurait été judicieux d'écrire :
X is 1 / (N=0) + Nx(Ndf0)
De même, on peut traduire
s <-- 0
pour i de1à n
si i pair
alors s <-- s + i*i
finsi i pair
finpour i de1à n
par
S is 0
I is 1
CORPS: exec (0=2|I) / 'S is S + IxI'
goto (N gt I is I+1) / CORPS
mais bien sûr pour un "vrai" Apliste, S vaut
+/(0=2| iota N)/ iota N
Enfin, un rernier exemple, le calcul de pi^2/6 par la série des 1/N^2 :
p <-- 0 X is 1 / NxN is 1 + P is 0
n <-- 1 TQ: goto (X>0.0001) / FINTQ
x <-- 1/(n*n) P is P + X is 1 / N×N is N + 1
tant que x > 0.0001 gotoTQ
p <-- p + x FINTQ:
n <-- n+1 P is (6×S)*.5
x <-- 1/(n*n)
fintant que x > 0.001 plus court : P is (6x+/÷(iota 10)*4)*.5
p <-- racine(6*s) mieux : trig 1 tout simplement
On quitte APL par :
)OFF
9. Documents utiles pour APL
Retour à la liste des autres tuteurs
Table (~160 k) du clavier APL
Table (postscript) de correspondance entre touche et fonction