GNU APL
# GNU APL

GNU APL est une implémentation du langage APL, libre et gratuite, sous licence GNU GPL. Sa version 1.0 a été annoncée le 27 septembre 2013. Cette implémentation est utilisable sous GNU/Linux, MacOS ou Cygwin.

Elle implémente le standard ISO 13751, "Langage APL étendu", comportant en conséquence les tableaux de tableaux.

Elle gère les nombres complexes et les variables partagées qui permettent à un espace de travail de communiquer facilement avec le monde extérieur. Elle rend même possible à qui le désire d'utiliser APL comme langage de script (sous Linux, par exemple, avec un #! apl ou #! /usr/bin/apl en tête du fichier).

## Généralités

GNU APL comportait, en décembre 2014, 60 000 lines de code C++. Quelques espaces de travail (workspaces) sont fournis en standard, conservés soit sous forme éditable xml, soit sous forme de dumps binaires (PSYS) bien plus rapides à charger. La commande )LIBS permet d'en avoir la liste. Il est possible aussi de stocker ou de lire un espace de travail en APL Transfer Form (ATF) telle que définie par IBM, au moyen des commandes )OUT et )IN, pour échanger des espaces de travail avec des interpréteurs différents ; toutefois aucun espace de travail n'est fourni au départ sous cette forme.

La gestion des variables partagées (⎕SVO, ⎕SVR, ⎕SVC, ⎕SVS, ⎕SVQ) est implémentée. Deux espaces de travail peuvent ainsi communiquer à condition d'être pour le moment (2016) sur la même machine.

Les processeurs auxiliaires AP100 (envoi de commandes système à l'hôte et lecture des réponses) et AP210 (lecture et écriture de fichiers) sont fournis avec leurs sources (en C) à titre d'exemple. L'utilisateur peut également étendre facilement GNU APL avec ses propres fonctions externes écrites en C.

Dans cette implémentation, les entiers comme les réels sont représentés sur 64 bits. Cela permet de travailler sans problème avec des entiers de 19 chiffres et correspond pour les réels à la double précision habituelle des calculs sur stations de travail scientifiques.

La version 1.4 (2014) a permis de communiquer avec des bases des données MySQL et PostgreSQL. La version 1.5 (2015) utilise de plus le parallélisme des microprocesseurs multi-cœur. La version courante est la 1.8 (2020)

L'auteur et mainteneur de GNU APL se nomme Jürgen Sauermann. La documentation de GNU APL en anglais est par ailleurs très détaillée : https://www.gnu.org/software/apl/apl.html

## Mise en place

La mise en place avec la version 1.8 est très facile : on télécharge depuis un miroir GNU le fichier apl-1.8.tar.gz depuis le répertoire APL, et on l'extrait sur sa machine dans un répertoire nommé par exemple apl. Depuis ce répertoire, il suffit de frapper :

et ensuite apl lorsqu'on a la main au bout de quelques secondes ou minutes.

## Glyphes et clavier APL

(Vous pouvez ne pas lire cette section si la gestion des polices de caractères et du clavier ne vous passionne pas dans un premier temps)

### Glyphes

**Depuis une console en mode texte**

Pour utiliser GNU APL depuis une console en mode texte pur (donc pas sous X-Window), la police Unifont-APL8x16.psf est disponible par exemple dans les dépôts d'Ubuntu (paquet psf-unifont, chargeable par Synaptic) ou d'autres distributions. Chargée dans /usr/share/consolefonts/, elle comporte 512 glyphes dont, outre les caractères APL, non seulement les caractères accentués français, mais également les ligatures.

**Depuis une console dans une fenêtre graphique**

Pour usage sous X-Window, la police TrueType ttf-unifont, également présente dans les dépôts et elle aussi chargeable par Synaptic, contient les caractères nécessaires et présente le mérite de pouvoir être mise à toutes les échelles souhaitées. Le rendu de cette police est optimal dans le corps 12, qui est celui où elle a été conçue.

### Clavier

Sous Linux, l'interpréteur, qui utilise les caractères Unicode, s'utilise dans une session de terminal que l'on ouvre en l'associant à une page de code appropriée. Cela est simple à imposer au niveau de tout le serveur X, mais peut aussi avec quelques précautions faire l'objet d'une convention différente pour chaque fenêtre, que celle-ci contienne un terminal ou non.

Une image du clavier proposé par défaut (USA) se trouve dans /etc/gnu-apl.d/keyboard1.txt. Il appartient à l'utilisateur de le modifier, au moyen d'un éditeur de texte, en fonction de sa propre configuration de clavier nationale. Depuis une session GNU APL, on peut l'afficher par ]KEYB (commençant par un ] et non un ), puisqu'il s'agit de l'appel d'un simple programme en C compilé appelé depuis GNU APL).

En NARS2000 et en Dyalog, les caractères APL s'obtiennent par combinaison d'une touche d'altération (Alt en NARS2000, Ctrl en Dyalog) et d'un caractère du clavier. En GNU APL, on peut utiliser une combinaison de touches pour basculer entre clavier texte et clavier APL.

**Global pour toutes les fenêtres sur ce serveur X**

On peut utiliser l'utilitaire setxkbmap : setxkbmap apl rendra les caractères APL accessibles au clavier si ttf-unifont a été installée, mais le fera pour tous les terminaux ouverts en même temps et la police APL remplacera la police par défaut (rendant alors problématique le retour à la normale par un setxkbmap fr). Cependant, setxkbmap peut être aussi utilisé pour ajouter des caractères plutôt que les remplacer; la commande est alors setxkbmap -model "pc105" -layout "fr,apl" -option "grp:alt_caps_toggle" : une fois cette commande passée, chaque fois que l'on presse Alt-CapsLock, on bascule alors entre les claviers français et $APL^,.$

**Sélectif pour chaque fenêtre**

Des méthodes d'entrée existent aussi pour les principales langues, dont le français avec ses touches mortes. Il est facile - bien que fastidieux dès que l'on dépasse dix touches à modifier - de changer la configuration en fonction de ses préférences (clavier IBM APL2 ou NARS2000), de ses besoins, ou de ses contraintes (par exemple combinaisons de touches pouvant être interceptées par le système en amont de la session APL).

**Akt : APL Keyboard Tool**

Sur github existe un outil permettant d'associer automatiquement une série de glyphes APL à des touches du claviers altérées par la touche Alt : https://github.com/TieDyedDevil/akt à condition de désactiver les altérations déjà définies s'il en existait (raccourcis clavier, par exemple).

### Dans la version 1.8 (2020)

La version 1.8 est accompagnée, outre du fichier INSTALL traditionnel, de 9 fichiers dont l'un indique comment configurer le clavier et installer les polices, et un autre comment mettre en œuvre l'exécution multicœur. L'installation en est facilitée d'autant.

## Appel et utilisation de l'interpréteur

Après avoir installé GNU APL et mis en place comme indiqué plus haut la reconnaissance du clavier étendu français + APL, il suffit de frapper apl depuis une console et on se retrouve sous l'interpréteur. On en sortira en frappant )off.

L'absence d'éditeur plein écran (contrairement à NARS2000) peut être gênante pour écrire des fonctions. Il est cependant toujours possible de les préparer dans une autre fenêtre et de les copier/coller dans la session GNU APL, ce qui constitue le principal intérêt de l'Unicode.

La version 1.8 est fournie avec un fichier de colorisation syntaxique pour vim.

### Commandes système

* )libs interroge les bibliothèques présentes. Sont marquées "missing" celles dont le répertoire n'existe pas encore. Il faudra le créer par un mkdir -p depuis une console.
* )lib liste les espaces de travail contenus dans une bibliothèque.
* )load charge un espace de travail en mémoire. )save le sauvegarde sur disque.
* )fns et )vars listent les fonctions et les variables présentes dans l'espace de travail.
* )history liste les dernières lignes saisies au clavier (instructions ou commandes APL en général).

### Fonctions système spécifiques

* ⎕cr affiche bien la représentation canonique d'une fonction, mais c'est 4 ⎕cr qui correspond au ⎕fmt de NARS2000 qui affiche en boites les données qui sont à sa droite.
* ⎕FIO effectue des entrées/sorties de caractères sur fichiers.
* ⎕PLOT affiche la courbe des valeurs qui sont à sa droite.

### Nouveautés de la version 1.8

* ⎕FFT (transformée de Fourier rapide, en nombres réels comme complexes).
* ⎕GTK (appel des fonctions de Gimp en APL).
* ⎕RE (expressions régulières).
* Commandes système définissables par l'utilisateur en APL.
* Interface entre Python et GNU APL, donnant accès aux fonctions vectorielles d'APL en Python.

## Bibliothèque d'échange d'exercices APL

Le site exercism permet d'échanger des exercices de GNU APL : https://exercism.io/tracks/gnu-apl/

## Essayer GNU APL sans l'installer

GNU APL a été porté en Javascript par Th. Baruchel et est accessible sous cette forme sur le site à l'adresse http://baruchel.hd.free.fr/apps/apl/ (voir illustration de gauche). Junger Sauermann propose également sa propre version d'essais interactifs http://juergen-sauermann.de/try-GNU-APL, à droite :

## Extension au standard

Le standard APL indique ce qui doit être supporté a minima, mais n'interdit pas pour autant les extensions. Jürgen Sauermann a introduit la possibilité de transmettre une valeur entre crochets comme argument supplémentaire d'une fonction, en particulier pour généraliser la notion d'opération sur un axe comme dans ,[1] ou +/[1] tout en mettant en garde sur le fait que cette extension peut nuire à la compatibilité des programmes GNU APL avec les autres systèmes, si ceux-ci ne l'adoptent pas. Il fournit l'exemple suivant :

