
Cliquez ICI pour avoir la table du clavier APL. (~20 k).
Comme le montre la table du clavier APL, APL est un langage un peu "spécial". Il utilise des symboles spéciaux. On peut utiliser un clavier normal à condition de connaitre la correspondance entre touche et symbole. 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. Dès que le tableau de correspondance sera scanné, nous le fournirons en en annexe. Sous Unix, utilisez pour un bon affichage la police Times Regular.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).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) minV renvoie l'entier inférieur ou égal à V maxX 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) AminB renvoie le min de A et B XmaxY 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 43. 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 / ! ? , iotaN renvoie les nombres de 1 à N rhoT 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 MiotaN renvoie l'indice de N dans M UrhoT 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 +/iotaN la somme des N premiers entiers ×/iotaN factorielle N 3 4rho7 1 2 3 4 car APL "boucle" sur les valeurs fournies. 5 6 7 1 2 3 4 5 (N,N)rho1,Nrho0 la matrice identité 2=+/0=(iotaN)|N 1 si N premier, 0 sinon 1=+/0=(iota minN*.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) is R ÷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)/iotaN 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=minV nombre d'occurrences du maximum de V ((rhoT),1)rhoT écriture du vecteur T en colonne5. Produits internes et externes
L'expression X°.fY renvoie le tableau cartésien des X[i]fY[j]. Ainsi (iota5) °.× iota10 donne la table de multiplication de 1, de 2 juqu'à la table de 5 et (iotaN) °.! iotaN donne le triangle de Pascal de taille N. 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. Ainsi (iotaN) °.= iotaN ? donne la matrice identité de taille N +/(iota/T)°.=T donne les effectifs des modalités de T (X ^.= Y) / iota(rhoY)[2] donne les numéros des colonnes de Y qui sont égales au vecteur X6. 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, (rhoT)[1] et son nombre de lignes et (rhoT)[2] son nombre de colonnes. En général, les indices commencent à 1. Toute structure de chiffres peut servir d'indices. Ainsi : 'PEURS'[2 5 û 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'[5û16 17 18 19 19 12 10 11 14 13 ] vaut donc ABDEL7. 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 Les tests et boucles se font via le branchement ; les labels sont repérés par le symbole : goto De plus, on peut traduire SIALORS { une expression } par un exec (exécute conditionnel). Exemples si N = 0 devient goto(Ndf0) / SINON alors x <-- 1 X is 1 sinon x <-- 1/n goto FINSI 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 par S is 0 pour i de1à n I is 1 si i pair CORPS: exec (0=2|I) / 'S is S + IxI' alors s <- s + i*i goto(NgtIisI+1) / CORPS finsi i pair finpour i de1à n mais bien sûr S vaut +/(0=2|iotaN)/iotaN Dernier exemple : { 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+/÷(iota10)*4)*.5 p <-- racine(6*s) mieux : trig1 tout simplement On quitte APL par : )OFF Dès que possible, un exemple sous forme Gif ou Postcsript. A suivre ...