# GNU APL

GNU APL est une implémentation du langage APL, libre et gratuite, sous licence GNU GPL. Sa version 1.0 avait été annoncée le 27 septembre 2013. Sa version 1.9 le 29 juin 2024. Cette implémentation est utilisable sous GNU/Linux, MacOS, Cygwin et Windows Subsystem for Linux.
Elle implémente le standard ISO 13751, "Langage APL étendu", comportant en conséquence les tableaux de tableaux. Les bases du langage lui-même se trouvent dans l'article APL (langage).
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), ainsi que d'exécuter depuis sa version 1.9 des instructions APL depuis un programme C !

## Généralités

GNU APL comportait, en décembre 2014, 60 000 lignes 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.9 (2024) qui permet d'exécuter des instructions APL depuis un programme C, en construisant l'interpréteur comme une bibliothèque libapl. Voici un exemple fourni avec le package :
Ce programme, nommé par exemple essai.c se compilera avec cc essai.c -lapl ... et donnera ceci à l'exécution :
La version 1.9 est fournie avec une importante documentation dont : APL Communication Cookbook, APL on Macintosh, GNU APL Designers Guide, GNU APL Memory Management, GNU APL Performance, Parallel APL, Quad GTK, fournie dans des formats ASCII, HTML et PDF.

## Auteur et mainteneur

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 depuis 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.
Une option de configuration de la version 1.9 est --with-libapl qui construit la bibliothèque libapl (fichiers apl.h et apl.lib) pour les exécutions d'instructions APL depuis un programme C, permettant de combiner par exemple la concision d'écriture et la puissance de traitement matriciel d'APL avec les fonctions graphiques 3D dynamiques et performantes d'OpenGL.

## 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).

### Versions 1.8 (2020) et 1.9 (2024)

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.
Différences entre les version 1.8 et 1.9

## 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.
Depuis la version 1.8 est fourni 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èques disponibles

Le site exercism permet d'échanger des exercices de GNU APL : https://exercism.io/tracks/gnu-apl/
Des workspaces APL comme utl contenant des fonctions APL utiles et téléchargeables se trouvent ici : https://sourceforge.net/projects/apl-library/

## 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 :