Notation comme outil de pensée (1979)
(jsoftware.com)- La notation est un outil essentiel pour aider la pensée, et joue un rôle central aussi bien en mathématiques que dans les langages de programmation
- Le langage APL a été développé comme une tentative de combiner les avantages de la notation mathématique avec l’exécutabilité et l’universalité d’un langage de programmation
- Les caractéristiques d’une bonne notation incluent la concision, la clarté, le pouvoir de suggestion, la subordination des détails et la possibilité de preuve formelle
- Il est possible de représenter et transformer efficacement avec APL diverses structures mathématiques (polynômes, transformations, graphes, etc.)
- L’introduction et l’apprentissage d’une notation doivent se faire naturellement dans le contexte, et sa structuration ainsi que sa polyvalence sont également importantes
La notation comme outil de pensée
- Dans des domaines scientifiques comme la chimie ou la botanique, une nomenclature systématique favorise aussi le progrès des disciplines
- George Boole soulignait que le langage lui-même est un moyen de penser
- La notation mathématique est un exemple représentatif de langage au service de la pensée, réduisant la charge cognitive et renforçant la capacité de raisonnement
- A.N. Whitehead et Charles Babbage ont souligné l’importance de la notation mathématique
Le potentiel des langages de programmation comme outils de pensée
- Les langages de programmation présentent les atouts de la polyvalence et de la clarté
- Ils permettent d’expérimenter des idées via l’ordinateur et de mener des expériences de pensée avec précision
- Cependant, la plupart des langages de programmation restent moins efficaces que la notation mathématique comme outils de pensée
- APL a été conçu comme une notation au service de la pensée, orientée vers la clarté et la précision
Principales caractéristiques d’une bonne notation
- Facilité d’expression du problème : elle doit permettre d’exprimer facilement des structures dérivées directement du problème
- Pouvoir de suggestion : la forme exprimée doit suggérer des problèmes analogues ou des extensions
- Subordination des détails : elle doit fournir une structure qui simplifie les détails complexes afin de faciliter la réflexion
- Concision : elle doit permettre une large gamme d’expressions avec un minimum de symboles et de règles
- Possibilité de preuve formelle : la notation doit se prêter aux preuves formelles et au raisonnement déductif
Introduction aux techniques de base de notation en APL
- Les structures fondées sur les tableaux, comme les vecteurs et les matrices, y sont utilisées naturellement
- Les fonctions et opérateurs s’appliquent automatiquement élément par élément aux vecteurs et matrices
- Des opérateurs comme la réduction (
/), le scan(\) et le produit intérieur(.) permettent d’exprimer des compositions de fonctions - Des symboles de base comme
⍳,⌽,⍴,+,×,*permettent de construire des expressions riches - Toutes les fonctions suivent une règle de priorité à droite, ce qui permet d’écrire naturellement des expressions sans parenthèses
Exemples de résolution de problèmes et de stimulation de la pensée
- Des suites mathématiques comme les nombres triangulaires ou les factorielles peuvent être exprimées par des formules simples
- La représentation des polynômes ainsi que des opérations comme la multiplication ou la dérivation sont traitées de manière concise avec des règles cohérentes
- La théorie des graphes (arbres, fermeture transitive, arbre couvrant) peut elle aussi être exprimée clairement au moyen d’opérations sur tableaux
- L’approche peut s’étendre à de nombreux domaines, comme les permutations, l’algèbre booléenne ou les conversions entre systèmes numériques (factorisation en nombres premiers)
Preuve formelle et pensée structurée
- Comme toutes les opérations et expressions sont formulées sous une forme clairement exécutable, une vérification automatique par ordinateur est possible
- Divers exemples de preuves formelles sont présentés à l’aide de la récurrence, de la recherche exhaustive et de l’énumération d’identités
- Démonstrations formelles de l’identité de partition de la réduction et du scan, ainsi que de l’associativité et de la distributivité du produit intérieur
- Preuves directes des fonctions symétriques de Newton, de la multiplication des polynômes et des formules de dérivation
Comparaison entre APL et la notation mathématique traditionnelle
- APL fournit une définition claire des fonctions, des opérations cohérentes sur tableaux et un système de symboles riche
- Toutes les opérations suivent une règle d’évaluation de droite à gauche plutôt qu’un système classique de priorités
- Il réduit la complexité liée à l’usage des symboles mathématiques et prend en charge la manipulation formelle (formal manipulation)
- Sa syntaxe est concise et ses règles cohérentes, ce qui profite autant aux débutants qu’aux utilisateurs expérimentés
Introduction et apprentissage de la notation
- Il met l’accent sur une introduction naturelle, dans le contexte, des seules notations nécessaires, sans « cours de langue » séparé
- De nouveaux symboles s’apprennent intuitivement dans des situations de problème concrètes
- Plus que la difficulté intrinsèque de la notation, l’important est de reconnaître les diverses possibilités et son extensibilité
Possibilités d’extension et propositions autour d’APL
- Proposition d’étendre les fonctions, notamment pour le traitement des nombres complexes
- Nécessité de standardiser les fonctions d’éléments uniques (unique elements) et de résumé (summary)
- L’introduction d’opérateurs plus généralisés pourrait prendre en charge des sujets supplémentaires comme le calcul vectoriel
- Objectif : améliorer la clarté de la conception du langage et ses capacités de raisonnement
Équilibre entre efficacité et clarté
- Il est recommandé de définir d’abord une notation claire et analysable, puis d’en améliorer l’efficacité par l’optimisation
- La clarification des algorithmes aide ensuite à l’optimisation et à l’optimisation par le compilateur
- Les expressions de base écrites en APL peuvent contribuer à la fois à la recherche académique et aux applications industrielles
1 commentaires
Commentaires Hacker News
Il est facile de voir la notation comme une extension de shell, quelque chose comme « remplacer une expression par une autre », mais en réalité c’est bien plus profond.
Mon professeur expliquait que les grandes découvertes s’accompagnent souvent d’une nouvelle notation ; une nouvelle notation signifie « une nouvelle façon de penser ce problème ».
Je pense que beaucoup de problèmes non résolus aujourd’hui pourraient être résolus si une notation puissante apparaissait.
C’est vraiment puissant, mais plutôt dans l’esprit Lisp ; l’approche d’APL ou de Clojure consiste plutôt à rendre les types de base réellement utiles.
Au lieu d’avoir 10 structures de données avec 10 fonctions chacune, on a 1 structure de données avec 100 fonctions ; dans APL, plutôt que de créer un DSL, on conçoit et agence les données avec beaucoup de soin, et le reste s’emboîte.
Richard Feynman, adolescent, en apprenant la trigonométrie, n’aimait pas la notation du sinus et du cosinus ; il a donc créé ses propres symboles mathématiques pour simplifier les formules et réduire le bruit.
Plus tard encore, avec les diagrammes de Feynman ou la notation slash, il a renouvelé à la fois la manière de penser la physique et la manière de l’exprimer.
Petit exemple : lorsque CoffeeScript est apparu, l’abréviation des lambdas et plusieurs commodités syntaxiques ont fortement changé la façon d’écrire JavaScript, en rendant le code plus facile à penser, à lire et à modifier.
SML/Haskell et la famille Lisp me donnent une impression similaire.
Ce court extrait de Brian Greene et Barry Mazur pourrait aussi vous plaire : https://youtu.be/8wQepGg8tHA
Historiquement, ce qui a supplanté APL, ce n’était pas seulement les claviers étranges, mais aussi Lotus 1-2-3 d’IBM, puis MS Excel peu après.
Les ingénieurs, le monde universitaire, les comptables et les MBA avaient besoin d’outils meilleurs que la TI-59 ou la HP-12C ; pendant ce temps, l’informatique se concentrait sur la manipulation symbolique, l’IA et LISP, et le secteur a fini par occuper cette place.
C’est un hasard regrettable : APL aurait pu avoir une influence bien plus grande que les tableurs et résoudre davantage de problèmes.
La vision initiale était une notation mathématique manuscrite, cohérente et exécutable, mais elle n’a jamais vraiment été réalisée.
Si cela vous intéresse, cet article vaut la lecture : https://mlajtos.mu/posts/new-kind-of-paper
On peut résoudre des problèmes sans payer, et le coût apparaît lorsqu’on déploie le résultat compilé devant des clients payants.
Si la solution correspond à un certain sous-ensemble, on peut aussi la porter vers April et la fournir depuis Common Lisp.
Cela dit, les gens du monde APL sont en général très académiques : ils peuvent réaliser un travail d’ingénierie rapidement et avec concision, mais si vous parlez de classement de fonctions ou de foncteurs napériens dans une entreprise logicielle moyenne, vos collègues risquent de se demander si vous n’avez pas besoin d’une aide médicale.
Une grande partie du développement logiciel consiste à inventer un langage technique assez formel qui exprime la façon dont les clients et les utilisateurs parlent et pensent ; dans les langages de la famille Iverson, ce n’est pas facile.
Java a longtemps obligé à expliciter, pour chaque méthode, quels mots métier y entraient et en sortaient, ce qui facilitait la projection des concepts de l’organisation dans le code.
En APL aussi, on peut nommer les données et les fonctions, mais dès qu’on introduit de longs noms et des structures d’espaces de noms pour mapper une organisation externe dans le code, on perd en concision et en élégance.
Même avec les systèmes de types sophistiqués de la famille ML, les développeurs ont du mal à relier directement les ontologies quasi linguistiques inventées aux organisations et aux processus, et choisissent plus souvent des concepts mathématiques ou académiques.
C’est possible s’il existe des personnes capables de faire les deux, mais le plus souvent, il suffit déjà de bien traduire vers le monde du client.
L’an dernier, The Array Cast a remis en ligne une interview d’Iverson datant de 1982 : https://www.arraycast.com/episodes/episode92-iverson
C’est assez intéressant et plus accessible que la conférence Turing.
En 1979, APL n’était pas un langage aussi étrange et marginal qu’aujourd’hui.
À l’époque, les langages de programmation n’étaient pas encore le phénomène populaire mondial qu’ils sont devenus, donc ils étaient presque tous étranges et marginaux ; C aussi était encore assez nouveau.
En étant un peu indulgent, APL ressemble à une abstraction pas si éloignée d’un C dense, qui permettait de programmer l’ordinateur sans implémenter directement des manipulations de pointeurs sur des tableaux.
Il existe aussi un bon nombre de manuels pour apprendre les maths avec la syntaxe d’APL [1] ou de J [2].
À l’origine, Iverson utilisait APL comme une meilleure syntaxe pour les mathématiques ; l’implémentation comme langage de programmation est arrivée quelques années plus tard.
[1] https://alexalejandre.com/about/#apl
[2] https://code.jsoftware.com/wiki/Books#Math_for_the_Layman
J’écoutais autrefois un podcast, aujourd’hui arrêté, sur la théorie des types ; c’était extrêmement abscons.
Le concept de base est relié à d’autres concepts utiles
L’hypothèse Sapir-Whorf est similaire, mais elle devient plus intéressante si on la prend à l’envers
Dans une langue imparfaite, il y a des choses qu’on ne peut pas penser, ou qu’il est difficile de penser ; cela amène à se demander s’il existe des choses que la langue que nous utilisons ne nous permet ni d’exprimer ni de penser
Ici, on peut entendre « langue » et « pensée » dans un sens plus large qu’à l’ordinaire
Par exemple, les règles d’interaction sociale déterminent-elles la manière dont nous interagissons ? Dans « Twitter and Teargas », Zeynep Tufekci dit que Twitter rend les flash mobs possibles, mais rend le changement social durable difficile
Des mécanismes sociaux comme suivre quelqu’un, commenter ou liker déterminent-ils, ou rendent-ils possibles, les manières dont nous interagissons les uns avec les autres ? D’autres mécanismes pourraient permettre une meilleure pensée collective
Il y a aussi la musique. Non pas la notation, mais la musique exprime-t-elle quelque chose qui ne peut pas vraiment être exprimé autrement ?
Ayant appris plusieurs langues étrangères, je trouve qu’il y a beaucoup de choses que je ne peux penser que dans une langue donnée, et qu’il est difficile de penser dans ma langue maternelle, l’anglais
Par exemple, le « гулять » ukrainien et russe porte beaucoup de sens que l’anglais ne saisit pas, si bien qu’avant d’apprendre ces langues, je n’avais jamais pensé à ces significations
« Гулять » signifie littéralement « marcher », mais s’emploie aussi pour chercher des expériences, y compris sexuelles
On peut se plaindre de quelqu’un qui s’est marié trop tôt en disant qu’il « не нагулялся », c’est-à-dire qu’il « n’a pas assez marché »
L’anglais a bien des expressions similaires comme « sow his wild oats », mais quand un seul verbe, « marcher », concentre autant de sens, cela change la pensée même de ce que signifie traverser la vie
Quand j’ai appris l’arabe aussi, il y avait beaucoup de sens et de pensées qui n’apparaissaient que dans cette langue ; non pas parce qu’ils seraient impossibles à expliquer en anglais, mais parce qu’il n’existe pas de notation concise pour les exprimer, ce qui oblige à écrire longuement
Certaines personnes aiment voyager vers d’autres pensées à travers la langue, tandis que d’autres sont paralysées devant cette possibilité
Comme toujours, la réussite tient à l’équilibre et aux deux côtés à la fois
Même si cela paraît évident à tout mathématicien ou informaticien, cette idée est très controversée chez les linguistes et les « éducateurs »
Son analogue linguistique est l’hypothèse Sapir-Whorf, selon laquelle la langue que l’on apprend détermine la manière de penser
Les langues naturelles sont des objets culturels, et cartographier les cultures, ne serait-ce que selon un ordre partiel faible, est considéré comme un tabou dans le monde académique
Cela a aussi de grandes conséquences pour l’éducation : il arrive que les élèves n’apprennent pas les notations qui leur permettraient réellement de raisonner sur les problèmes qu’ils rencontrent
Franchement, je ne comprends pas bien cette partie
Le fait que les locuteurs de n’importe quelle langue puissent apprendre les mêmes mathématiques ou les mêmes programmes informatiques le montre
On peut même se demander si une langue parlée ou écrite est nécessaire à la pensée
Il existe au moins de vastes domaines de pensée possibles sans langage ; les humains aussi ont jadis été sans parole, ou presque, et ce sont les pensées et les intentions de communiquer qui ont créé les mots et les langues
Il me semble donc étrange de considérer la langue apprise comme le modèle fondamental de la pensée
Par exemple, certains affirment que si une société désigne la couleur de la mer et celle de l’herbe par le même mot, alors ses membres ne perçoivent pas la différence entre les deux couleurs
Pas seulement qu’ils encodent l’expérience dans la mémoire de façon similaire, mais qu’ils ne voient pas la différence
L’affirmation selon laquelle on ne peut même pas entendre un son absent d’une langue donnée est du même ordre
La discussion sur la notation ici se rapproche plutôt de l’idée que le vocabulaire peut servir à l’exploration
Comme lorsqu’on peut dire non pas simplement qu’on a entendu un son, mais qu’on a entendu de la musique, et même une progression d’accords particulière, etc.
Je développe actuellement un projet en APL
C’était dans mon backlog depuis longtemps, mais j’écris maintenant du code pour de vrai
Il s’est écoulé pas mal de temps entre le moment où je m’y suis intéressé et celui où j’ai pu écrire autre chose que des one-liners
Au début de ce processus, j’ai découvert cet article et je l’ai lu comme en l’absorbant ; aujourd’hui, ses concepts sont devenus une base complète de ma pensée
J’enseigne d’ailleurs NAATOT dans un programme d’architecture
Pas d’architecture logicielle, mais de conception architecturale
J’utilise une version éditée qui conserve l’essentiel d’Iverson, et je n’ai gardé des mathématiques et de la programmation proprement dites que ce qu’il faut pour faire passer le message et inciter les étudiants à penser autrement les possibilités de la conception et des outils d’expression
Autrement dit, il s’agit du processus de formation des idées, de la manière de les exprimer pour soi-même et pour les autres
Si j’en avais l’occasion dans un programme plus souple et plus ouvert, j’aimerais essayer de monter un cours où les étudiants créeraient leurs propres systèmes de signes et de notation à appliquer au domaine de la conception architecturale
Je regrette de ne pas avoir terminé l’application de notes Freeform que je construisais autrefois
C’était une application compilée en pages web autonomes via SVG, et je pense que c’était une très belle idée pour les contenus techniques courants dans les domaines STEM
Voici un ancien exemple de notes de chimie : https://colbyn.github.io/old-school-chem-notes/dev/chemistry-1010---fall-2021/week-14-acids-and-bases.html
Je me demande quel système il utilise maintenant
Pendant des années, j’ai regardé APL comme une sorte de magie, puis j’ai pris le temps de l’apprendre au début de cette année
Ce qui m’a surpris, c’est qu’avec APL, on peut faire tenir une quantité énorme de code dans un seul tweet
C’est amusant, mais difficile à utiliser
Une fois terminé, je me dis presque toujours : « Ça m’a pris autant de temps à écrire ? », et je me demande si j’aurais dû utiliser un autre outil
Mais il est contre-intuitif de constater qu’en réalité, un autre outil aurait pris beaucoup plus de temps
Ce qui paraît difficile et chronophage est en fait le processus par lequel on est forcé de formuler la spécification du problème de manière plus condensée
C’est un peu comme gravir un chemin plus raide mais beaucoup plus court : ça semble plus pénible, mais il y a en réalité moins de travail
C’est pourquoi je pense qu’il faudrait que j’apprenne et utilise APL
Je ne suis personnellement pas d’accord avec le postulat de l’article selon lequel « la notation mathématique manque d’universalité et doit être interprétée différemment selon le sujet, l’auteur et le contexte »
Je pense qu’une notation séparée de la visualisation du problème et de l’ergonomie humaine a un coût important
Certains chercheurs préfèrent des notations qui cachent beaucoup de complexité et permettent des révélations façon « eurêka » ou des équivalences inattendues, mais selon les cas, cela peut au contraire devenir obscur et propice aux erreurs
Cela reste toutefois un outil important pour communiquer le raisonnement
Je pense que n’avoir qu’une seule notation standard pour un domaine, ou pour des domaines proches, réprime assez fortement les aspects créatifs, artistiques et exploratoires du raisonnement et de la résolution de problèmes
Terry Tao a aussi donné une excellente explication à propos de la notation : https://news.ycombinator.com/item?id=23911903
En mathématiques, il existe des efforts pour créer des systèmes de raisonnement « enterprise » comme Lean ou Coq, et dans ce cas un système de notation universel se justifie
Mais pour l’exploration personnelle, il peut être préférable d’assembler les choses comme on veut
Personnellement, c’est dans l’enseignement que cela m’a le plus posé problème
Dans les cours d’algèbre, par exemple, c’était difficile quand l’enseignant ne traitait pas ses décisions et préférences personnelles en matière de notation de façon cohérente ou honnête, et mes compétences en mathématiques se sont nettement améliorées en étudiant la théorie des types et la théorie de la preuve mécanisée
Je pense que le concept de « subordination des détails » dans l’article n’a pas été suffisamment approfondi
Après avoir longtemps lu et écrit des applications APL, j’en suis venu à comprendre que ce concept désigne une manière de gérer la complexité fondamentalement différente de l’abstraction
Nous sommes entourés de barrières d’abstraction comme les API, bibliothèques, modules, packages et interfaces, avec pour résultat des problèmes familiers : de hautes tours d’abstraction, des développeurs qui assemblent des API, une coupure avec le matériel, des difficultés à raisonner sur les performances
APL rend très confortable une autre approche
Au lieu de concevoir des abstractions, on conçoit soigneusement les données pour qu’elles soient faciles à manipuler avec des expressions simples
Là où l’on aurait généralement une fonction de bibliothèque ou un terme de DSL, on utilise directement des opérations primitives
Par exemple, avec une table de chaînes, un tableau de clés et un tableau de valeurs, on peut construire une structure proche d’une hashmap avec valeurs vectorielles et clés internées, puis gérer l’insertion, la sortie et la suppression directement via des expressions APL
L’avantage de cette approche est que chaque expression n’est pas une boîte noire, ce qui permet de l’ajuster naturellement à un besoin particulier
Dans une insertion de hashmap classique, il faudrait du code pour ajouter une nouvelle clé, mais ici on exploite l’invariant commun selon lequel il suffit d’ajouter une valeur à une clé existante
Avec une API de bibliothèque, il aurait fallu des chemins de code inutilisés, plusieurs variantes de fonctions d’insertion, ou une inférence de types sophistiquée pour éliminer le code mort
Cette approche laisse fuiter dans la base de code des préoccupations indépendantes du domaine
En subordonnant les détails au lieu de les cacher, on peut accéder aux détails propres au domaine autant que nécessaire, tandis que les détails sans rapport restent tranquillement en arrière-plan jusqu’au moment où l’on en a besoin
Bien sûr, il faut être très à l’aise avec les expressions APL, mais je ne pense pas que ce soit une charge beaucoup plus lourde que d’apprendre en profondeur quelque chose comme l’écosystème Python
En pratique, les symboles APL disparaissent en arrière-plan et commencent à apparaître comme des syntagmes porteurs de sens, un peu comme on lit l’anglais par mots et groupes de mots plutôt que lettre par lettre
C’est impossible dans la plupart des langages, mais si le langage est suffisamment concis et expressif, cela redevient possible à une assez grande échelle
Je repense toujours à l’idée qu’Arthur Whitney déteste vraiment le scrolling
Pas besoin non plus d’avoir 20 fichiers ouverts et de suivre des « aller à la définition »
Quand tout le programme tient sur une page, tout cela disparaît, et on navigue avec les mouvements des yeux
J’ai sincèrement l’impression qu’il faut que je prenne le temps de l’apprendre
Cela rejoint profondément les difficultés que j’ai rencontrées ces dernières semaines
Je regarde du code Python legacy beaucoup trop fortement couplé, et toutes les tentatives précédentes d’« amélioration » consistaient à ajouter encore des abstractions par-dessus un mauvais modèle de données
En lisant le code de façon linéaire, on ne peut pas savoir quelle méthode modifie l’objet d’entrée
Certaines le modifient, d’autres non, et parfois elles renvoient simplement le même argument d’entrée sans modification
Plutôt qu’un océan de détours où une factory renvoie plusieurs calculateurs qui ne partagent même pas la même interface, je préférerais presque des chaînes magiques que l’on puisse analyser et comprendre
Parce que toutes les opérations sont en O(n)
On peut utiliser des opérateurs génériques, mais il faut comprendre avec soin ce que les paires de valeurs signifient dans la logique métier et comment maintenir la bonne structure à chaque opération
Une personne qui lit le programme pour la première fois aura tout autant de mal à comprendre le sens métier que les opérations primitives
S’il y a une amélioration, je pense qu’elle ne vient pas du fait que la complexité est placée ailleurs, mais du fait que le code et les valeurs réelles sont visibles en même temps
Ce qui rend la programmation complexe plus facile, c’est d’avoir côte à côte les données à l’exécution et les opérations du code ; c’est pourquoi les outils d’IDE améliorent sans cesse les débogueurs et les inspecteurs pour montrer ce que fait le programme à chaque étape
Dans ce contexte, qu’on abstraie une partie des opérations ou une partie de la structure de données, créer une nouvelle abstraction bonne et concise reste une bonne chose
Dans l’exemple, le code d’insertion est surtout du nettoyage de données qui transforme la forme que l’interpréteur permet de saisir en la forme nécessaire, plutôt que l’ajout souhaité lui-même
⍪←est le véritable ajout, tandis que↓⍉↑()()()ressemble plutôt à du parsing et à une transformation d’entrée pour contourner les limites d’APL et du parseur d’entrée de l’interpréteurLe code de suppression doit lui aussi produire des tableaux booléens sans rapport avec le domaine du problème, par exemple en enveloppant
'buggy'pour le chercher comme élément unique d’un tableau imbriquéDire que l’on « crée une hashmap de valeurs vectorielles » prête aussi à confusion, puisqu’il n’y a pas de vrai hachage
Il n’y a pas non plus de vérification des clés en double, il est impossible de choisir le hash ou d’ajuster vitesse et distribution, et les clés étant ajoutées dans l’ordre, la recherche est lente
Dyalog APL dispose aussi d’I-Beam 1500, une commande magique de l’interpréteur qui marque des tableaux comme cibles de hachage interne pour accélérer les recherches, mais il faut sans cesse garder en tête que l’abstraction interne fuit
De bonnes idées de conception de langages et d’outils, comme le « pit of success », « une seule façon de faire », « la première méthode qui vient à l’esprit devrait être la bonne » ou « les tâches différentes devraient avoir une apparence différente », manquent à APL
En Python ou en C#, une syntaxe comme
kv={'a':1, 'b':2}fonctionne simplement ; si l’on oublie une accolade ou deux-points, cela paraît clairement faux, et l’éditeur comme le compilateur aidentLes implémentations APL s’appuient, pour l’entrée/sortie, sur des fonctions magiques de l’interpréteur comme
⎕NGET,⎕CSVet⎕JSON, et la gestion des erreurs, le logging et le débogage sont également faiblesToute l’expression s’exécute d’un seul bloc, et les hooks et forks la rendent difficile à découper facilement
Au final, il faut avoir une intuition précise des diverses formes de tableaux, de la raison pour laquelle
⊂3semble ne rien faire, de la différence entre⊆et⊂, de l’extension scalaire, etc., avant même de pouvoir expérimenter et apprendreMême un pattern immédiatement accessible comme « mettre à jour si la clé existe, l’ajouter sinon » oblige en APL à repenser la manière de brancher le flux
Là où en Python on passerait par
if/elseetkey in map, ou en C# parif/elseetmap.Contains(key), en APL on tombe dans la réflexion sur la réimplémentation de fonctionnalités de baseC’est proche de ce qu’a soutenu Aaron Hsu, mais cela donne l’impression d’Up-Goer 5 ou du toki pona, où l’on ne peut pas dire « camion de pompiers » et où il faut dire « la voiture des personnes dont le travail est d’arrêter le feu »
[1] https://docs.dyalog.com/latest/CheatSheet%20-%20I-Beams.pdf
[3] https://aplwiki.com/wiki/Scalar_extension
[4] https://xkcd.com/1133/