Tuteur pour le langage APL

novalid      

Texte du Tuteur écrit par Gilles HUNAULT


Retour à la liste des autres tuteurs

Table (~160 k) du clavier APL

Table (postscript) de correspondance entre touche et fonction

Téléchargement et installation d'APL

Documentation et Références

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 : UT 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 +/VW 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 / NN is N + 1 tant que x > 0.0001 gotoTQ p <-- p + x FINTQ: n <-- n+1 P is (6S)*.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

Téléchargement et installation d'APL

Pages des idiomes APL au format Word avec les polices TTF