Notation als Werkzeug des Denkens (1979)
(jsoftware.com)- Notation ist ein wichtiges Werkzeug, das das Denken unterstützt, und spielt sowohl in der Mathematik als auch in Programmiersprachen eine zentrale Rolle
- Die APL-Sprache wurde als Versuch entwickelt, die Vorteile mathematischer Notation mit der Ausführbarkeit und Universalität von Programmiersprachen zu verbinden
- Merkmale guter Notation sind Prägnanz, Klarheit, Suggestivität, Unterordnung von Details und die Möglichkeit formaler Beweise
- Verschiedene mathematische Strukturen (Polynome, Transformationen, Graphen usw.) lassen sich mit APL effizient ausdrücken und transformieren
- Einführung und Erlernen von Notation sollten natürlich im Kontext erfolgen; auch die Strukturiertheit und Allgemeingültigkeit der Notation sind wichtig
Notation als Werkzeug des Denkens
- Auch in wissenschaftlichen Bereichen wie Chemie und Botanik fördert eine systematische Nomenklatur den Fortschritt des Fachs
- George Boole betonte, dass Sprache selbst ein Mittel des Denkens ist
- Mathematische Notation ist ein typisches Beispiel für eine Sprache, die das Denken unterstützt, die Denklast reduziert und die Denkfähigkeit erweitert
- A.N. Whitehead und Charles Babbage betonten die Bedeutung mathematischer Notation
Das Potenzial von Programmiersprachen als Werkzeuge des Denkens
- Programmiersprachen haben die Stärken Allgemeingültigkeit und Klarheit
- Mit dem Computer lassen sich Ideen erproben und klare Denkexperimente durchführen
- Die meisten Programmiersprachen sind jedoch als Werkzeuge des Denkens schwächer als mathematische Notation
- APL wurde als Notation entworfen, die das Denken unterstützt und auf Klarheit und Präzision abzielt
Wichtige Merkmale guter Notation
- Leichte Darstellung von Problemen: Strukturen, die sich direkt aus einem Problem ableiten, sollten sich einfach ausdrücken lassen
- Suggestivität: Die ausgedrückte Form sollte auf ähnliche oder erweiterte Probleme hinweisen
- Unterordnung von Details: Sie sollte eine Struktur bieten, die komplexe Details vereinfacht und so das Denken unterstützt
- Prägnanz: Mit minimalen Symbolen und Regeln sollte ein breites Ausdrucksspektrum möglich sein
- Möglichkeit formaler Beweise: Die Notation sollte für formale Beweise und deduktives Schließen geeignet sein
Einführung in die grundlegenden Notationstechniken von APL
- Array-basierte Strukturen wie Vektoren und Matrizen werden auf natürliche Weise verwendet
- Funktionen und Operatoren werden automatisch elementweise auf Vektoren/Matrizen angewendet
- Mit Operatoren wie Reduktion(
/), Scan(\) und innerem Produkt(.) lassen sich Funktionskombinationen ausdrücken - Mit Grundsymbolen wie
⍳,⌽,⍴,+,×,*lassen sich reichhaltige Ausdrücke bilden - Alle Funktionen folgen der Regel der Rechtsbindung, sodass sich natürliche Ausdrücke ohne Klammern schreiben lassen
Beispiele für Problemlösung und Förderung des Denkens
- Mathematische Folgen wie Dreieckszahlen oder Fakultäten lassen sich mit einfachen Ausdrücken darstellen
- Polynomdarstellung sowie Operationen wie Multiplikation und Differentiation lassen sich mit konsistenten Regeln knapp behandeln
- Auch die Graphentheorie (Bäume, transitive Hülle, Spannbäume) lässt sich mit Array-Operationen klar ausdrücken
- Das lässt sich auf verschiedene Bereiche wie Permutationen, Boolesche Algebra und Zahlensystemumwandlungen (Primfaktorzerlegung) erweitern
Formale Beweise und strukturiertes Denken
- Da alle Operationen und Ausdrücke in klar ausführbarer Form dargestellt werden, ist eine automatische Verifikation durch den Computer möglich
- Es werden verschiedene Beispiele formaler Beweise gezeigt, darunter mathematische Induktion, vollständige Suche und das Auflisten von Identitäten
- Formale Beweise für Zerlegungsidentitäten von Reduktion und Scan sowie für Assoziativität und Distributivität innerer Produkte werden gegeben
- Newtonsche symmetrische Funktionen sowie Formeln für Polynom-Multiplikation und Differentiation werden direkt bewiesen
Vergleich von APL mit traditioneller mathematischer Notation
- APL bietet eine klare Definition von Funktionen, konsistente Array-Operationen und ein reichhaltiges Symbolsystem
- Für alle Operationen gilt statt eines Prioritätsregelsystems die Regel der Ausführung von rechts nach links
- Es reduziert die Komplexität der Verwendung mathematischer Symbole und unterstützt formale Manipulation
- Die Syntax ist knapp und die Regeln konsistent, was sowohl für Einsteiger als auch für Fortgeschrittene vorteilhaft ist
Einführung und Lernen von Notation
- Es wird betont, benötigte Notation ohne separate „Sprachlektionen“ natürlich im Kontext einzuführen
- Neue Symbole werden in konkreten Problemsituationen intuitiv erlernt
- Wichtiger als die Schwierigkeit der Notation selbst ist es, die vielfältigen Möglichkeiten und Erweiterbarkeit zu erkennen, die sie andeutet
Erweiterbarkeit und Vorschläge für APL
- Vorschläge zur Erweiterung von Funktionen einschließlich der Verarbeitung komplexer Zahlen
- Bedarf an Standardisierung einer Funktion für eindeutige Elemente (unique elements) sowie einer Zusammenfassungsfunktion (summary)
- Durch allgemeinere Operatoren könnten zusätzliche Themen wie Vektoranalysis unterstützt werden
- Ziel ist eine höhere Klarheit des Sprachdesigns und bessere Schlussfolgerungsfähigkeit
Gleichgewicht zwischen Effizienz und Klarheit
- Empfohlen wird, zunächst eine klare und analysierbare Notation zu definieren und die Effizienz anschließend durch Optimierung zu erhöhen
- Die Klärung des Algorithmus hilft später auch bei Optimierung und Compiler-Optimierung
- In APL geschriebene Grundausdrücke können sowohl zur wissenschaftlichen Forschung als auch zu industriellen Anwendungen beitragen
1 Kommentare
Meinungen auf Hacker News
Man kann Notation leicht als so etwas wie Shell-Expansion verstehen, also als „Ersetzen eines Ausdrucks durch einen anderen“, aber in Wirklichkeit geht sie viel tiefer.
Mein Professor erklärte, dass große Entdeckungen oft zusammen mit neuer Notation auftreten; neue Notation bedeutet „eine neue Art, über dieses Problem nachzudenken“.
Ich glaube, dass sich auch viele der heute ungelösten Probleme lösen ließen, wenn eine leistungsfähige Notation entstünde.
Das ist wirklich mächtig, liegt aber eher in der Lisp-Tradition; APL oder Clojure zielen eher darauf ab, die Basistypen wirklich nützlich zu machen.
Statt 10 Datenstrukturen mit je 10 Funktionen zu haben, nimmt man eine Datenstruktur mit 100 Funktionen; in APL baut man also weniger eine DSL, sondern entwirft und arrangiert die Daten sehr sorgfältig, woraufhin sich der Rest passend ergibt.
Richard Feynman mochte als Teenager, als er Trigonometrie lernte, die Notation für Sinus und Kosinus nicht und erfand eigene mathematische Symbole, um Formeln zu vereinfachen und Rauschen zu reduzieren.
Auch später erfand er mit Feynman-Diagrammen oder der Slash-Notation zugleich neue Arten, Physik zu denken und auszudrücken.
Ein kleines Beispiel: Als CoffeeScript aufkam, änderten Lambda-Kürzel und diverse syntaktische Bequemlichkeiten die Art, JavaScript zu schreiben, erheblich; es wurde leichter zu denken, zu lesen und zu ändern.
Bei SML/Haskell und der Lisp-Familie fühlt es sich ähnlich an.
Dieser kurze Clip von Brian Greene und Barry Mazur dürfte ebenfalls gefallen: https://youtu.be/8wQepGg8tHA
Historisch wurde APL nicht nur von seltsamen Tastaturen verdrängt, sondern auch von IBMs Lotus 1-2-3 und dem kurz darauf erschienenen MS Excel.
Ingenieure, Akademiker, Buchhalter und MBAs brauchten bessere Werkzeuge als TI-59 oder HP-12C; die Informatik hingegen war mit symbolischer Verarbeitung, AI und LISP beschäftigt, und am Ende besetzte die Industrie diesen Raum.
Es ist ein bedauerlicher Zufall, denn APL hätte weit größeren Einfluss haben und viel mehr Probleme lösen können als Tabellenkalkulationen.
Die ursprüngliche Vision war eine konsistente, handschriftliche und ausführbare mathematische Notation, aber sie wurde nie wirklich erreicht.
Wer interessiert ist, sollte diesen Beitrag lesen: https://mlajtos.mu/posts/new-kind-of-paper
Man kann Probleme lösen, ohne zu zahlen; Kosten entstehen, wenn man das kompilierte Ergebnis an zahlende Kunden ausliefert.
Wenn die Lösung in eine bestimmte Teilmenge passt, kann man sie auch nach April übertragen und über Common Lisp bereitstellen.
Allerdings sind APL-Leute meist sehr akademisch geprägt: Sie können Engineering-Aufgaben schnell und knapp erledigen, aber wenn man in einer durchschnittlichen Softwarefirma von Funktions-Rängen oder naperischen Funktoren anfängt, könnten die Kollegen vermuten, dass man medizinische Hilfe braucht.
Ein erheblicher Teil der Softwareentwicklung besteht darin, eine halbwegs formale technische Sprache zu erfinden, die ausdrückt, wie Kunden und Nutzer sprechen und denken; in Sprachen aus der Iverson-Familie ist das nicht einfach.
Java zwang lange dazu, bei jeder Methode explizit zu machen, welche Geschäftsbegriffe hinein- und herausgehen, und machte es dadurch leichter, die Konzepte einer Organisation auf Code abzubilden.
Auch in APL kann man Daten und Funktionen benennen, aber in dem Moment, in dem man lange Namen und Namensraumstrukturen einführt, um eine externe Organisation auf Code abzubilden, verliert man Kürze und Eleganz.
Selbst in den ausgefeilten Typsystemen der ML-Familie haben Entwickler Schwierigkeiten, erfundene quasi-sprachliche Ontologien direkt mit Organisationen und Prozessen zu verbinden, und greifen häufiger zu mathematischen oder akademischen Konzepten.
Wenn es jemanden gibt, der beides kann, ist es möglich; meistens genügt es aber schon, nur die Übersetzung in die Welt des Kunden gut hinzubekommen.
Letztes Jahr hat The Array Cast ein Iverson-Interview von 1982 erneut veröffentlicht: https://www.arraycast.com/episodes/episode92-iverson
Es ist ziemlich interessant und zugänglicher als die Turing Lecture.
APL war 1979 nicht so eine seltsame Rand-Sprache wie heute.
Damals waren Programmiersprachen noch kein weltweites Massenphänomen wie heute; fast alle waren irgendwie seltsam und randständig, und auch C war damals noch ziemlich neu.
Mit etwas Wohlwollen wirkt APL wie eine Abstraktion, die von dichtem C gar nicht so weit entfernt ist, und erlaubte es, den Computer zu programmieren, ohne Pointer-Manipulationen auf Arrays direkt zu implementieren.
Es gibt auch etliche Lehrbücher, die Mathematik mit APL-[1]- oder J-[2]-Syntax vermitteln.
Iverson verwendete APL ursprünglich als bessere Syntax für Mathematik; die Programmierimplementierung kam erst einige Jahre später.
[1] https://alexalejandre.com/about/#apl
[2] https://code.jsoftware.com/wiki/Books#Math_for_the_Layman
Früher habe ich einmal einen inzwischen eingestellten Podcast über Typentheorie gehört; der Inhalt war extrem schwer zugänglich.
Das Grundkonzept ist mit anderen nützlichen Konzepten verknüpft
Auch die Sapir-Whorf-Hypothese ist ähnlich, wird aber interessanter, wenn man sie umkehrt
In einer nicht perfekten Sprache gibt es Dinge, die man nicht denken kann oder die schwer zu denken sind; dann stellt sich die Frage, ob es Dinge gibt, die wir mit der Sprache, die wir verwenden, weder ausdrücken noch denken können
„Sprache“ und „Denken“ kann man hier weiter fassen als üblich
Bestimmen zum Beispiel die Regeln sozialer Interaktion, wie wir interagieren? Zeynep Tufekci sagt in „Twitter and Teargas“, dass Twitter Flashmobs möglich macht, nachhaltigen sozialen Wandel aber erschwert
Bestimmen oder ermöglichen soziale Mechanismen wie jemandem zu folgen, zu kommentieren oder Likes zu vergeben, wie wir miteinander interagieren? Andere Mechanismen könnten besseres kollektives Denken ermöglichen
Dann gibt es Musik. Nicht Notation, sondern: Drückt Musik etwas aus, das sich auf andere Weise kaum gut ausdrücken lässt?
Als jemand, der mehrere Fremdsprachen gelernt hat, gibt es vieles, das ich nur in einer bestimmten Sprache denken kann und das in meiner Muttersprache Englisch schwer zu denken ist
Zum Beispiel trägt das ukrainische und russische „гулять“ viele Bedeutungen, die das Englische nicht erfasst, und bevor ich diese Sprachen gelernt hatte, hatte ich über diese Bedeutungen nie nachgedacht
„Гулять“ bedeutet wörtlich „gehen/spazieren“, wird aber auch im Sinn von Herumziehen auf der Suche nach Erfahrungen verwendet, einschließlich sexueller Erfahrungen
Man kann sich darüber beklagen, dass jemand zu früh geheiratet habe: „не нагулялся“, also „nicht genug gegangen“
Im Englischen gibt es ähnliche Wendungen wie „sow his wild oats“, aber wenn ein einziges Verb wie „gehen“ so viele Bedeutungen trägt, verändert das die Vorstellung davon, durch das Leben zu gehen
Als ich Arabisch lernte, gab es ebenfalls viele Bedeutungen und Gedanken, die nur in dieser Sprache entstehen; nicht weil sie sich auf Englisch unmöglich erklären ließen, sondern weil es keine knappe Notation dafür gibt und man lange Texte bräuchte
Manche Menschen reisen gern über Sprache in andere Gedankenwelten, andere sind angesichts dieser Möglichkeit wie gelähmt
Wie immer liegt der Erfolg im Gleichgewicht und darin, beides zu nutzen
Für Mathematiker oder Informatiker ist das eine völlig offensichtliche Tatsache, und doch ist diese Idee unter Linguisten und „Pädagogen“ höchst umstritten
Das linguistische Analogon ist die Sapir-Whorf-Hypothese, also die Behauptung, dass die Sprache, die man lernt, die Denkweise bestimmt
Natürliche Sprachen sind kulturelle Objekte, und Kulturen auch nur als schwache partielle Ordnung abzubilden, gilt in der Wissenschaft fast als Tabu
Auch für Bildung hat das große Folgen: Manchmal lernen Studierende keine Notation, die sie wirklich über die Probleme, mit denen sie konfrontiert sind, schlussfolgern lässt
Diesen Teil verstehe ich ehrlich gesagt nicht gut
Die Tatsache, dass Sprecher jeder Sprache dieselbe Mathematik oder dieselben Computerprogramme lernen können, zeigt das
Fraglich ist auch, ob gesprochene oder geschriebene Sprache für Denken überhaupt notwendig ist
Zumindest gibt es große Bereiche des Denkens, die auch ohne Sprache möglich sind; auch Menschen hatten einst keine oder nur sehr wenig Sprache, und der Wunsch und die Absicht zu kommunizieren brachten Wörter und Sprachen hervor
Deshalb wirkt es seltsam, erlernte Sprache als Grundmodell des Denkens zu betrachten
Wenn zum Beispiel eine Gesellschaft die Farbe des Meeres und die Farbe von Gras mit demselben Wort bezeichnet, wird daraus mitunter gefolgert, sie könne den Unterschied zwischen den beiden Farben nicht erfahren
Nicht nur, dass die Erfahrung ähnlich im Gedächtnis kodiert wird, sondern dass der Unterschied nicht gesehen werde
Ähnlich ist die Behauptung, Laute, die es in einer Sprache nicht gibt, könne man überhaupt nicht hören
Die Diskussion über Notation hier liegt näher daran, dass Vokabular zur Erkundung genutzt werden kann
Etwa so, dass man nicht nur sagen kann, man habe einen Klang gehört, sondern man habe Musik gehört und eine bestimmte Akkordfolge usw. wahrgenommen
Ich entwickle derzeit ein Projekt in APL
Es stand lange im Backlog, aber jetzt schreibe ich tatsächlich Code
Zwischen dem Zeitpunkt, an dem ich Interesse daran bekam, und dem Zeitpunkt, an dem ich mehr als Einzeiler schreiben konnte, lag eine ziemlich lange Zeit
Früh in diesem Prozess entdeckte ich dieses Paper und las es geradezu aufsaugend; heute sind seine Konzepte zu einer vollständigen Grundlage meines Denkens geworden
Tatsächlich unterrichte ich NAATOT in einem Architekturprogramm
Nicht Softwarearchitektur, sondern architektonischer Entwurf
Ich verwende eine Fassung, die so bearbeitet ist, dass Iversons Kern erhalten bleibt; die eigentliche Mathematik und Programmierung habe ich nur so weit beibehalten, dass sie den Punkt verdeutlicht und die Studierenden herausfordert, anders über Entwurf und Ausdruckswerkzeuge nachzudenken
Es geht also um Prozesse der Ideenbildung und darum, wie man sie sich selbst und anderen gegenüber ausdrückt
Wenn ich die Gelegenheit in einem lockereren, offeneren Programm hätte, würde ich gern einen Kurs durchführen, in dem Studierende ihre eigenen Zeichen- und Notationssysteme für den Einsatz im architektonischen Entwurf entwickeln
Ich bedauere, dass ich die Freeform-Notiz-App, an der ich früher gearbeitet habe, nie fertiggestellt habe
Es war eine App, die über SVG zu eigenständigen Webseiten kompiliert wurde, und ich halte sie für eine wirklich großartige Idee für technische Inhalte, wie sie in MINT-Fächern häufig vorkommen
Ein altes Beispiel mit Chemie-Notizen gibt es hier: https://colbyn.github.io/old-school-chem-notes/dev/chemistry-1010---fall-2021/week-14-acids-and-bases.html
Ich frage mich, welches System heute verwendet wird
Einige Jahre lang habe ich APL als eine Art Magie betrachtet, bis ich mir Anfang dieses Jahres die Zeit genommen habe, es zu lernen.
Ich war erstaunt, wie unglaublich viel Code man mit APL in einen Tweet packen kann.
Es macht Spaß, ist aber schwer zu benutzen.
Danach denke ich fast immer: „Dafür habe ich so lange gebraucht?“, und frage mich, ob ich ein anderes Tool hätte verwenden sollen.
Aber dass ein anderes Tool in Wirklichkeit viel länger gedauert hätte, widerspricht der Intuition.
Der Teil, der sich schwierig und zeitraubend anfühlt, ist eigentlich der Prozess, in dem man gezwungen wird, die Problemspezifikation in einer stärker verdichteten Form zu formulieren.
Es ist ein bisschen so, als würde man einen steileren, aber viel kürzeren Weg hinaufgehen: Es fühlt sich anstrengender an, ist tatsächlich aber weniger Arbeit.
Deshalb habe ich das Gefühl, dass ich APL lernen und verwenden sollte.
Der Prämisse des Papers, dass „mathematische Notation keine Universalität besitzt und je nach Thema, Autor und Kontext unterschiedlich interpretiert werden muss“, stimme ich persönlich nicht zu.
Ich denke, dass Notation, die von der Visualisierung des Problems und von Ergonomie getrennt ist, hohe Kosten verursacht.
Manche Wissenschaftler bevorzugen Notationen, die viel Komplexität verbergen und so „Heureka“-artige Einsichten oder unerwartete Gleichwertigkeiten ermöglichen, aber je nach Fall kann das eher unklar und fehleranfällig sein.
Trotzdem ist sie ein wichtiges Werkzeug, um Denkprozesse zu vermitteln.
Nur eine einzige Standardnotation für ein bestimmtes Gebiet oder eng verwandte Gebiete zu haben, unterdrückt meiner Ansicht nach die kreativen, künstlerischen und explorativen Aspekte von Schlussfolgern und Problemlösung ziemlich stark.
Es gibt auch eine ausgezeichnete Erklärung von Terry Tao zur Notation: https://news.ycombinator.com/item?id=23911903
In der Mathematik gibt es Bestrebungen, „Enterprise“-Inferenzsysteme wie Lean und Coq zu entwickeln; in solchen Fällen ist ein universelles Notationssystem sinnvoll.
Für persönliche Exploration kann es aber besser sein, sich irgendetwas passend zurechtzulegen.
Persönlich hatte ich damit in der Ausbildung größere Schwierigkeiten.
In Algebra-Kursen und Ähnlichem fiel es mir schwer, wenn Lehrende ihre persönlichen Entscheidungen und Vorlieben bei der Notation nicht konsistent oder offen behandelten; durch das Studium von Typentheorie und Theorie maschineller Beweise haben sich meine mathematischen Fähigkeiten deutlich verbessert.
Ich denke, das Konzept der „Unterordnung von Details“ im Paper wird nicht gründlich genug ausgelotet.
Nachdem ich lange APL-Anwendungen gelesen und geschrieben habe, ist mir klar geworden, dass dieses Konzept auf eine Art des Komplexitätsmanagements verweist, die sich grundlegend von Abstraktion unterscheidet.
Wir sind von Abstraktionsbarrieren wie APIs, Bibliotheken, Modulen, Paketen und Interfaces umgeben, und die Folgen sind vertraute Probleme wie hohe Türme von Abstraktionen, Entwickler, die APIs zusammenkleben, die Entkopplung von der Hardware und Schwierigkeiten beim Nachvollziehen von Performance.
APL macht einen anderen Ansatz sehr bequem.
Statt Abstraktionen zu entwerfen, gestaltet man die Daten sorgfältig so, dass sie sich mit einfachen Ausdrücken leicht manipulieren lassen.
Dort, wo normalerweise eine Bibliotheksfunktion oder ein DSL-Begriff stünde, verwendet man direkt primitive Operationen.
So kann man etwa mit einer String-Tabelle, einem Schlüssel-Array und einem Werte-Array eine hashmap-ähnliche Struktur mit Vektorwerten und internalisierten Schlüsseln bauen und Einfügen, Ausgeben und Löschen direkt als APL-Ausdrücke behandeln.
Das Gute an dieser Methode ist, dass jeder Ausdruck keine Blackbox ist und sich daher ganz natürlich an konkrete Bedürfnisse anpassen lässt.
Bei einer normalen Hashmap-Einfügung bräuchte man Code zum Hinzufügen neuer Schlüssel; hier nutzt man die gemeinsame Invariante, dass man nur einem bestehenden Schlüssel einen Wert hinzufügen muss.
Mit einer Bibliotheks-API hätte man ungenutzte Codepfade, mehrere Varianten von Einfügefunktionen oder ausgefeilte Typinferenz zur Dead-Code-Eliminierung gebraucht.
Ein solcher Ansatz lässt domänenfremde Anliegen in die Codebasis einsickern.
Wenn man Details nicht versteckt, sondern unterordnet, kann man auf domänenspezifische Details genau in dem Maß zugreifen, wie man sie braucht, während irrelevante Details ruhig im Hintergrund bleiben, bis sie benötigt werden.
Natürlich muss man mit APL-Ausdrücken sehr vertraut sein, aber ich halte das nicht für eine wesentlich größere Hürde, als sich tief in etwas wie das Python-Ökosystem einzuarbeiten.
In der Praxis treten die APL-Symbole in den Hintergrund, und man beginnt, sie als sinnvolle Phrasen zu sehen, so wie man englische Wörter nicht Buchstabe für Buchstabe liest, sondern als Wörter und Wendungen.
In den meisten Sprachen ist das unmöglich, aber wenn eine Sprache knapp und ausdrucksstark genug ist, wird es in ziemlich großem Umfang wieder möglich.
Ich muss immer daran denken, dass Arthur Whitney Scrollen wirklich hasst.
Man muss auch nicht 20 Dateien offen haben und ständig „Zur Definition springen“ hinterherlaufen.
Wenn das gesamte Programm auf eine Seite passt, verschwindet das, und man navigiert mit Augenbewegungen.
Ich habe ernsthaft das Gefühl, mir die Zeit nehmen zu müssen, es zu lernen.
Das berührt auch stark die Schwierigkeiten, die ich in den letzten Wochen hatte.
Ich schaue mir Legacy-Python-Code an, der viel zu stark gekoppelt ist, und alle früheren „Verbesserungs“-Versuche bestanden darin, auf ein falsches Datenmodell noch mehr Abstraktion zu schichten.
Wenn man den Code linear liest, kann man nicht erkennen, welche Methode das Eingabeobjekt verändert.
Manche verändern es, manche nicht, und manchmal wird sogar einfach dasselbe Eingabeargument unverändert zurückgegeben.
Lieber magische Strings, die man analysieren und verstehen kann, als ein Meer von Umwegen, in dem Factories mehrere Rechner zurückgeben, die nicht einmal dasselbe Interface teilen.
Denn alle Operationen sind O(n).
Man kann zwar allgemeine Operatoren verwenden, muss aber sorgfältig verstehen, was Wertepaare in der Domänenlogik bedeuten und wie man bei jeder Operation die korrekte Struktur erhält.
Wer das Programm zum ersten Mal liest, wird genauso sehr damit kämpfen, die Bedeutung in der Business-Domäne zu verstehen, nicht die primitiven Operationen.
Wenn es eine Verbesserung gibt, dann meiner Meinung nach nicht, weil die Komplexität woanders liegt, sondern weil Code und tatsächliche Werte gleichzeitig sichtbar sind.
Was komplexe Programmierung einfacher macht, ist, dass Laufzeitdaten und Codeoperationen nebeneinander sichtbar sind; deshalb verbessern IDE-Tools ständig Debugger und Inspector, um zu zeigen, was ein Programm in jedem Schritt tut.
In diesem Kontext bleibt es eine gute Sache, gute und knappe neue Abstraktionen zu schaffen, egal ob man einen Teil der Operationen oder einen Teil der Datenstruktur abstrahiert.
Der Einfügecode im Beispiel ist größtenteils nicht die gewünschte Hinzufügung selbst, sondern Datenaufbereitung, die die vom Interpreter eingebbare Form in die benötigte Form umwandelt.
⍪←ist die eigentliche Hinzufügung, während↓⍉↑()()()eher Eingabe-Parsing und Transformation ist, um Grenzen von APL und des Eingabe-Parsers des Interpreters zu umgehen.Auch der Löschcode muss Dinge wie
'buggy'umhüllen, um es als einzelnes Element eines verschachtelten Arrays zu finden, und dafür boolesche Arrays erzeugen, die mit dem Problembereich nichts zu tun haben.Auch die Aussage, man erstelle eine „Hashmap mit Vektorwerten“, ist irreführend, weil es tatsächlich kein Hashing gibt.
Es gibt keine Prüfung auf doppelte Schlüssel, keine Möglichkeit, Hash-Auswahl oder Geschwindigkeit und Verteilung abzustimmen, und da Schlüssel der Reihe nach angehängt werden, ist auch die Suche langsam.
In Dyalog APL gibt es zwar auch I-Beam 1500, einen magischen Interpreter-Befehl, der Arrays für schnelle Lookups als intern zu hashende Objekte markiert, aber man muss ständig im Blick behalten, dass hier eine interne Abstraktion durchleckt.
Gute Ideen des Sprach- und Werkzeugdesigns wie „pit of success“, „es gibt nur einen Weg“, „der erste naheliegende Weg sollte der richtige sein“ und „andere Aufgaben sollten anders aussehen“ fehlen APL.
In Python oder C# funktioniert Syntax wie
kv={'a':1, 'b':2}einfach, und wenn man Klammern oder Doppelpunkte vergisst, sieht es eindeutig falsch aus; Editor und Compiler helfen dabei.APL-Implementierungen stützen sich bei Ein- und Ausgabe auf magische Interpreter-Funktionen wie
⎕NGET,⎕CSVund⎕JSON, und auch Fehlerbehandlung, Logging und Debugging sind schwach.Der gesamte Ausdruck wird als Ganzes ausgeführt, und wegen Hooks und Forks lässt er sich auch nicht leicht zerlegen.
Am Ende muss man die verschiedenen Array-Formen, warum
⊂3so aussieht, als tue es nichts, den Unterschied zwischen⊆und⊂, skalare Erweiterung und Ähnliches exakt im Gefühl haben, damit Experimentieren und Lernen überhaupt möglich werden.Auch bei einem unmittelbar zugänglichen Muster wie „wenn der Schlüssel existiert, aktualisieren, sonst hinzufügen“ muss man in APL schon bei der Art der Verzweigung neu nachdenken.
In Python erledigt man das mit
if/elseundkey in map, in C# mitif/elseundmap.Contains(key), während man in APL in Überlegungen zur Neuimplementierung von Grundfunktionen hineingerät.Das ähnelt zwar Argumenten von Aaron Hsu, fühlt sich aber an wie Up-Goer 5 oder Toki Pona, wo man nicht „Feuerwehrauto“ sagen kann, sondern „Auto einer Person, die Feuer stoppt“.
[1] https://docs.dyalog.com/latest/CheatSheet%20-%20I-Beams.pdf
[3] https://aplwiki.com/wiki/Scalar_extension
[4] https://xkcd.com/1133/