Les caractères APL sont faciles à retenir

 

par Charles Hubert

 

Généralités

 

A la vue d'un algorithme écrit en APL, le profane le trouve incompréhensible à cause des caractères spéciaux dont il ignore la signification. En réalité on peut les mémoriser facilement en quelques jours de pratique ; on décrit ici des recettes mnémotechniques.

En APL toutes les fonctions ont la même syntaxe copiée sur la soustraction (‑A ou B‑A), il exécute toute instruction de droite à gauche et aucune fonction n'est prioritaire sur une autre. Les caractères spéciaux à APL désignent des fonctions ou des variables que d'autres langages représentent par des symboles réservés. Par exemple le minimum de a et b s'écrit

           
et le plancher de a s'écrit

           

En APL les données sont des tableaux avec un nombre d'indices quelconque ; chaque case d'un tableau peut être un nombre, un caractère ou une boîte contenant un tableau.

Ces caractéristiques et d'autres permettent des algorithmes beaucoup plus courts en APL qu'en d'autres langages.

On notera une fonction

  

   D   = argument droit

   G   = argument gauche s'il existe

   R   = résultat s'il y en a un

Les caractères spéciaux sont ou des idéogrammes simples, ou dérivés de caractères ordinaires un peu suggestifs. Certains caractères sont des superpositions de deux caractères plus simples ; par exemple  est la superposition de  et  ce qu'on indiquera par

  
Sur les claviers modernes on les obtient directement au moyen de Alt ou Alt+Maj.

 

Caractères ne représentant pas des fonctions

 

   à partir de ce caractère la fin de la ligne est un commentaire : une lampe  en haut d'un poteau  éclaire la route.

( ) les parenthèses enferment une évaluation prioritaire ; comme dans d'autres langages.

'   deux apostrophes enferment une chaîne de caractères ; comme dans d'autres langages.

 aux 26 majuscules et 26 minuscules, APL ajoute le delta majuscule, et le delta majuscule souligné qu'il aurait dû remplacer par un delta minuscule, comme il l'a fait pour les 26 majuscules soulignées d'autrefois ; APL autorise ces deux deltas et le trait bas "_" dans les noms symboliques.

.   dans une constante numérique le point sépare les parties entière et fractionnaire ; comme dans d'autres langages.

   le moins haut  indique qu'une constante numérique est négative, tandis que le moins habituel "-" indique une soustraction.

   vecteur vide de nombres : prenons un simple zéro "0" et rayons-le +"~", le reste est vide.

:   séparateur indiquant que le symbole qui est à sa gauche est l'étiquette d'une instruction : comme dans d'autres langages.

   ce losange sépare des instructions sur une même ligne ; d'autres langages utilisent ";".

   début et fin du texte d'une fonction.

   début et fin du texte d'une fonction  verrouillée +"~".

 

Les fonctions qui calculent

 

+ - addition, soustraction.

 multiplication, division ; comme sur les calculettes.

   puissance, exponentielle : complication de 

   logarithme : inverser (retourner)  l'exponentielle 

!   factorielle (ou coefficient du binôme) ; APL écrit !n et non n!

   inversion ou division  matricielle 

   fonctions circulaires (sin, cos, ...) et par prolongement fonctions hyperboliques : ce caractère est un cercle, ce n'est ni une lettre ni un chiffre.

   module (valeur absolue) si G est absent, ou modulo G ; APL écrit |x et non │x│.

   plafond  ou maximum : l'ergot de  est en haut.

   plancher ou minimum : l'ergot de  est en bas.

?   tirage aléatoire : on ne peut pas prévoir la valeur de R "?".

   réduire si G est une fonction : +/ pour la somme des valeurs de D,  pour leur produit, etc... la dimension de R est réduite par rapport à celle de D 

   réduire sur le premier indice : les lignes "-"+"/" pour une matrice.

   balayer : propager la fonction G sur D 

   balayer sur le premier indice : les lignes "-"+"\" pour une matrice.

 produit (interne) matriciel : un autre langage pourrait écrire G.D pour le produit des matrices G et D ; mais APL précise que chaque terme de R est une somme "+" de produits  ce qui lui permet de généraliser avec d'autres fonctions comme  pour un produit de puissances, ou  pour un produit de différences, etc...

 produit (externe ou tensoriel) de tous les couples possibles :  peut être remplacé par n'importe quelle fonction par exemple  pour toutes les sommes,  pour toutes les différences, etc... le petit cercle  ne représente aucune fonction.

   traduit D en base de numération G.

   valeur représentée par D en base de numération G :  renversé.

   traduit D  en tableau de caractères 

   calcule (exécute)  les nombres ou l'instruction décrits par la chaîne de caractères  D : c'est  renversé.

 

Les fonctions logiques

 

Les valeurs logiques possibles sont les deux nombres
    1 = vrai = oui        0 = faux = non
comme en langage C par exemple.

   comparaisons usuelles ; le caractère "=" n'indique pas une affectation de valeur mais répond à la question G et D sont-ils égaux ?

~   non logique ; échange les valeurs logiques 0 et 1.

   et logique.

   ou logique.

   non-et

   non-ou

   D et G sont-ils identiques ?

   chaque valeur de G est-elle un élément de D ?

   occurence :  étendu à une chaîne +"_" de valeurs dans G.

   vecteur de tous les éléments enfouis dans D si G est absent.

 

Les fonctions qui ne calculent pas

 

   affecte : envoie D dans G ; c'est "=" ou ":=' dans d'autres langages.

   brancher ou aller à D.

   prend  : soulève 

   laisse : repose  

   rotation ou miroir : par exemple pour une matrice fait tourner  les colonnes  ou autour de la verticale  sur le dernier indice.

   rotation ou miroir : par exemple pour une matrice fait tourner  les lignes +"-" ou autour de l'horizontale +"-" sur le premier indice.

   transposer : par exemple pour une matrice fait tourner  autour de la diagonale +"\".

   tri croissant   : en plaçant D[R] en colonne  les grandes valeurs sont dans le bas  de la liste 

   tri décroissant : en plaçant D[R] en colonne  les grandes valeurs sont dans le haut de la liste 

/   comprimer si G est logique : la dimension de R est plus petite que celle de D 

   comprimer sur le premier indice : les lignes "-"+"/" pour une matrice.

\   dilater si G est logique : la dimension de R est plus grande que celle de D 

   dilater sur le premier indice : les lignes "-"+"\" pour une matrice.

   emballer D dans une boîte : en lisant de droite à gauche on place quelque chose dans une boîte.

   déballer les boîtes de D : en lisant de droite à gauche on sort quelque chose d'une boîte.

   appliquer la fonction dans chaque boîte de D et de l'éventuel G : le tréma  c'est deux points qui suggèrent deux boîtes.

   profondeur de D : trois traits horizontaux suggèrent trois niveaux.

   redimensionner (restructurer) D à la dimension de G en reprenant au début s'il n'y a pas assez de valeurs  :  = "r grec".

   si G est absent alors la dimension (structure) de D.

   l'indice dans G de chaque valeur de D :  = iota = "i grec".

   si G est absent alors R = la liste des D premières valeurs de n'importe quel indice.

 caractères enfermant les indices pour adresser dans un tableau ; comme dans d'autres langages.

   fonction d'adressage dans D par les indices G : ce caractère est un "I" gras évidé.

,   caténation (chaînage) de G avec D.

,   transformation de D en un vecteur si G est absent : caténation de toutes les composantes de D.

   caténation suivant le premier indice : pour des matrices caténation "," des lignes +"-".

   exécute ce qui est tapé au clavier  si c'est D ; met en forme à l'écran  si c'est G.

   saisit les caractères "'" entrés au clavier  si c'est D ; affiche à l'écran  sans mise en forme  si c'est G.

   est aussi l'initiale de tous les symboles réservés par exemple