APL

Uit Wikipedia, de vrije encyclopedie

Ga naar: navigatie, zoeken

APL is een programmeertaal. De taal is ontstaan uit een boek dat in 1962 werd geschreven door Ken Iverson en waarin een wiskundige notatiewijze werd geïntroduceerd. Met enkele aanpassingen werd uit dit voorstel de programmeertaal ontworpen. De naam APL is ontleend aan de titel van het boek: A Programming Language.

Inhoud

[bewerk] Korte geschiedenis

[bewerk] Ontwikkelingen in de tijd

Zoals gezegd, de taal is ontstaan naar aanleiding van de publicatie van Kenneth E. Iverson. Hoewel zijn boek in 1962 uitkwam, ontdekte en ontwikkelde hij de taal al in 1957. Als programmeertaal werd APL al snel populair in vooral de wetenschappelijke en financiële wereld vanwege de krachtige mogelijkheden die de taal biedt om om te gaan met meer-dimensionale array's met data. Oorspronkelijk draaide APL op (IBM)-mainframes en over de loop van jaren ontstonden er verschillende dialecten van de taal. Na de opkomst van de PC begin jaren 80 van de twintigste eeuw, en de afname van de populariteit van mainframes kwam er een versie van APL uit voor de PC onder de naam APL*Plus/PC van ontwikkelaar STSC (zie eventueel: STSC (engels)). De eeste versie voor de PC kwam in 1982 op de markt en in het midden van de jaren 80 kwam er ook een 32-bit versie voor de Unix systemen op de markt als APL*Plus/Unix). Tot 1995 bleef STSC APL*Plus verder ontwikkelen, maar verkocht de rechten in dat jaar aan LEX2000 Inc. wat vervolgens in 1999 weer in handen kwam van Cognos. De belangstelling en het gebruik van APL is de laatste jaren erg teruggelopen, natuurlijk mede onder invloed van de komst van nieuwe ontwikkelomgevingen als C (en de opvolgers C+ / C++) en later Java). Er bestaat nog wel een groep die-hards die APL en varianten/dialecten als A+[1] gebruiken en ontwikkelen.

[bewerk] van mainframe naar PC

De overgang naar de nieuwe PC-omgeving vereiste natuurlijk wel wat toevoegingen om op een nieuwe manier om te gaan met -vooral- de uitvoer van gegevens en andere specifieke eigenaardigheden van de PC. De eerste versies draaiden (uiteraard) onder MS-DOS en dat waren specifiek single-user- en single-taskomgevingen. Dit vraagt een heel andere benadering van geheugengebruik, en commando's die verband houden met je rechten hoeveel gebruik jouw programma mag maken van de CPU hebben weinig nut. Om portering van bestaande programma's van mainframeomgevingen naar de PC te vereenvoudigen bleven in de PC-versie commando's en functies bestaan die feitelijk niets deden, maar wel de compabiliteit van workspaces verhoogden. (Na de overstap van MS-DOS naar Windows kwam je weer terug in een multi-user- en multi-taskingomgeving; maar wel op een andere wijze dan bij mainframesystemen.)

[bewerk] huidige situatie

Hoewel het gebruik sterk is teruggelopen blijft er toch nog steeds een enthousiaste groep gebruikers die via internet nieuwe ontwikkelingen gebaseerd op APL ontwikkelt.

  • Vanaf 2001 bestaat het project Aplus of A+ dat vrij verkrijgbaar is onder de GNU General Public License. Het is in 1998 ontwikkeld door Arthur Whitney [2] werkzaam bij de bank Morgan Stanley. Dit bedrijf had over de jaren - zoals veel vergelijkbare bedrijven - veel programmatuur ontwikkeld in APL. Omdat de banken afscheid namen van hun mainframes en gebruik gingen maken van systemen onder SunOS/Solaris zocht men een geschikte APL-omgeving daarvoor, maar die was niet beschikbaar. Omdat het bedrijf de bestaande tools in APL liever niet zou moeten afschaffen danwel geheel opnieuw zouden moeten schrijven in een andere taal faciliteerden zij de ontwikkeling van A+ door Arthur Whitney en is de bank nog steeds sponsor van het project.[3]
  • VisualAPL en APLNext: nieuwe versies van APL speciaal geschikt voor .NET omgevingen.[4]
  • DialogAPL, een moderne versie van APL voor verschillende Windows en Linux/Unix platformen.[5]
  • IBM APL2: een interpreter voor IBM systemen[6]
Een uitgebreider overzicht kun je vinden op de engelse Wiki over APL

[bewerk] Verschillen

De programmeertaal verschilt in veel opzichten van andere talen.

  • Alle ingebouwde functies worden voorgesteld door een teken. De gebruikelijke tekens Image:APLplus.svg en Image:APLminus.svg voor optellen en aftrekken zijn normaal aanwezig, maar ook voor andere functies, zoals faculteit, logaritme en sinus, worden tekens gebruikt.
  • Er zijn geen sleutelwoorden zoals if en for. Alle voorwaardelijke instructies worden uitgedrukt met de sprongopdracht (voorgesteld door het teken Image:APLrightarrow.svg ) met daarachter een expressie die geëvalueerd wordt naar een regelnummer.
  • Letters worden alleen gebruikt om identifiers te maken. De enige uitzondering is de letter Image:APLE.svg, die ook wordt gebruikt in een getal met drijvende komma. Verder worden letters gebruikt voor systeemopdrachten, zoals LOAD en SAVE, maar die maken geen deel uit van de taal.
  • Er is een apart minteken Image:APLhighminus.svg voor negatieve getallen, terwijl voor aftrekken en negatie het gewone minteken Image:APLminus.svg wordt gebruikt. Wellicht is APL de enige programmeertaal waarin een negatief getal niet als expressie wordt ingevoerd. er is verschil tussen Image:APLhighminus.svgImage:APL5.svgImage:APLplus.svgImage:APL8.svg en Image:APLminus.svgImage:APL5.svgImage:APLplus.svgImage:APL8.svg, het eerste is Image:APL3.svg, het tweede Image:APLhighminus.svgImage:APL1.svgImage:APL3.svg.
  • Er geldt geen volgorde van bewerkingen. Een expressie wordt strikt van rechts naar links uitgevoerd (tenzij er haakjes zijn gebruikt). Vermenigvuldigen heeft geen voorrang boven optellen en aftrekken.
  • Er zijn geen expliciete declaraties. Door een hele array toe te kennen aan een identifier, wordt er geheugenruimte voor die identifier gereserveerd, voldoende ruimte voor de hele array.
  • Hele arrays worden ineens verwerkt. Er zijn functies die een hele array kunnen maken of kopiëren, of die een bewerking kunnen uitvoeren op een array als geheel.
  • De taal is niet gestructureerd. Dat wordt tegenwoordig als een nadeel gezien. De beginselen van het gestructureerd programmeren waren nog niet gebruikelijk in de tijd dat de taal ontworpen werd. Evenwel, doordat de taal hele arrays ineens verwerkt, is het zelden nodig een for- of while-statement te gebruiken.

Een groot voordeel van APL is dus dat er heel compact en snel gecodeerd kan worden. Tegelijkertijd is dat een nadeel. Een APL-source is vaak lastig te lezen vanwege de vele vreemde tekens.

[bewerk] Invoer

Het toetsenbord van een IBM 2741, met APL-tekens. Daaronder de combinaties die kunnen worden gemaakt met behulp van de BS-toets.
Het toetsenbord van een IBM 2741, met APL-tekens. Daaronder de combinaties die kunnen worden gemaakt met behulp van de BS-toets.

Voor het invoeren van APL-symbolen is een speciaal toetsenbord nodig. Het getoonde toetsenbord heeft geen aparte hoofd- en kleine letters: de lettertoetsen geven in combinatie met Shift een symbool.

En nog heeft het toetsenbord te weinig toetsen. Daarom kunnen er ook combinaties (overstrikes) worden gemaakt. Wenst met bijvoorbeeld een uitroepteken om de functie faculteit uit te voeren, dan typt men een aanhalingsteken (shift K), een backspace en een punt. Op dezelfde wijze kunnen ook de letters (andere tekens niet) onderstreept worden.

Er zijn verder diverse APL-editors. Om invoer te vergemakkelijken kan men van veel symbolen de naam invoeren.

[bewerk] Gegevens

Gegevens kunnen, zoals bij elke programmeertaal, uit arrays bestaan. Maar bij APL wordt een array als eenheid beschouwd. Een array kan een willekeurig aantal dimensies hebben. Een array van twee dimensies heet 'matrix', een array van een dimensie heet 'vector'. Een array van nul dimensies bestaat ook, dat is een scalar.

De dimensie van een array kan desnoods de lengte nul of één hebben. Dat lijkt niet erg zinvol, maar een array met een dergelijke dimensie kan door een programma uitgebreid worden.

Een vector (2 of langer) kan als constante worden ingevoerd als een reeks getallen met spaties ertussen, bijvoorbeeld Image:APL1.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APL9.svgImage:APLsp.svgImage:APL1.svgImage:APL6.svgImage:APLsp.svgImage:APL2.svgImage:APL5.svg. Geeft men een enkel getal op, dan is dat een scalar. Wil men een andere array, dan zal men een functie moeten gebruiken.

De bekendste functie om een array te maken is reshape {Image:APLrho.svg. Bijvoorbeeld, de expressie Image:APL2.svgImage:APLsp.svgImage:APL4.svgImage:APLrho.svgImage:APL9.svgImage:APLsp.svgImage:APL8.svgImage:APLsp.svgImage:APL1.svgImage:APLsp.svgImage:APL1.svgImage:APL2.svgImage:APLsp.svgImage:APL1.svgImage:APL6.svgImage:APLsp.svgImage:APL2.svgImage:APL5.svgImage:APLsp.svgImage:APL1.svgImage:APL4.svgImage:APLsp.svgImage:APL1.svgImage:APL4.svg maakt een matrix van 2 bij 4, met de daarachter opgegeven getallen als waarden.

Een andere veel gebruikte functie is de indexgenerator ((APL|iota}} die een vctor van natuurlijke getallen maakt. Image:APLiota.svgImage:APL5.svg levert dus de vector Image:APL1.svgImage:APL2.svgImage:APL3.svgImage:APL4.svgImage:APL5.svg. Het ziet er niet erg zinvol uit, maar deze functie is vaak heel handig.

De meeste functies zijn erg vergevingsgezind als een argument de verkeerde vorm heeft. Bijvoorbeeld, de hierboven genoemde functie {Image:APLrho.svg heeft als linkerargument in principe een vector nodig, maar een scalar is ook goed.

Een array kan, zoals in elke programmeertaal, geïndiceerd worden: Image:APLA.svgImage:APLlbracket.svgImage:APLI.svgImage:APLrbracket.svg. Zijn er twee of meer indexen, dan worden ze gescheiden door Image:APLsemicolon.svg. Het is beslist niet nodig dat op deze wijze een enkele waarde uit een array wordt gehaald: door een array als index te gebruiken of een index weg te laten is het mogelijk een deel uit een array te selecteren: de expressieImage:APLR.svgImage:APLlbracket.svgImage:APLsemicolon.svgImage:APL3.svgImage:APLsp.svgImage:APL4.svgImage:APLrbracket.svg heeft als resultaat een matrix bestaande uit de derde en de vierde kolom van de matrix Image:APLR.svg - de hele kolommen omdat de eerste index, tussen Image:APLlbracket.svg en Image:APLsemicolon.svg is weggelaten.

[bewerk] Voorbeeld

Onderstaande regel is een programma dat alle priemgetallen van 1 tot R vindt:

Image:APLlparen.svgImage:APLtilde.svgImage:APLR.svgImage:APLepsilon.svgImage:APLR.svgImage:APLsmallcircle.svgImage:APLfullstop.svgImage:APLtimes.svgImage:APLR.svgImage:APLrparen.svgImage:APLslash.svgImage:APLR.svgImage:APLleftarrow.svgImage:APL1.svgImage:APLdownarrow.svgImage:APLiota.svgImage:APLR.svg

en de beschrijving van rechts naar links:

  1. Image:APLiota.svgImage:APLR.svg maakt een vector met gehele getallen van Image:APL1.svg t/m Image:APLR.svg, dus Image:APL1.svgImage:APLsp.svgImage:APL2.svgImage:APLsp.svgImage:APL3.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APL5.svg als Image:APLR.svgImage:APLeq.svgImage:APL5.svg
  2. Image:APL1.svgImage:APLdownarrow.svg 'drop' laat eerste getal weg: Image:APL2.svgImage:APLsp.svgImage:APL3.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APL5.svg
  3. Image:APLleftarrow.svg assignment operator: dus Image:APLR.svg is nu Image:APL2.svgImage:APLsp.svgImage:APL3.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APL5.svg
  4. Image:APLsmallcircle.svgImage:APLfullstop.svgImage:APLtimes.svg uitproduct van Image:APLR.svg en Image:APLR.svg: dit resulteert in de matrix:
    Image:APLsp.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APLsp.svgImage:APLsp.svgImage:APL6.svgImage:APLsp.svgImage:APLsp.svgImage:APLsp.svgImage:APL8.svgImage:APLsp.svgImage:APL1.svgImage:APL0.svg
    Image:APLsp.svgImage:APLsp.svgImage:APL6.svgImage:APLsp.svgImage:APLsp.svgImage:APLsp.svgImage:APL9.svgImage:APLsp.svgImage:APL1.svgImage:APL2.svgImage:APLsp.svgImage:APL1.svgImage:APL5.svg
    Image:APLsp.svgImage:APLsp.svgImage:APL8.svgImage:APLsp.svgImage:APL1.svgImage:APL2.svgImage:APLsp.svgImage:APL1.svgImage:APL6.svgImage:APLsp.svgImage:APL2.svgImage:APL0.svg
    Image:APL1.svgImage:APL0.svgImage:APLsp.svgImage:APL1.svgImage:APL5.svgImage:APLsp.svgImage:APL2.svgImage:APL0.svgImage:APLsp.svgImage:APL2.svgImage:APL5.svg
  5. Image:APLepsilon.svg onderzoekt van elk getal in de linker parameter Image:APL2.svgImage:APLsp.svgImage:APL3.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APL5.svg of het in de rechter parameter (de matrix) voorkomt. Alleen de Image:APL4.svg komt voor, dus het resultaat is: false false true false (in werkelijkheid Image:APL0.svgImage:APLsp.svgImage:APL0.svgImage:APLsp.svgImage:APL1.svgImage:APLsp.svgImage:APL0.svg)
  6. Image:APLtilde.svg, negatie: dus Image:APL1.svgImage:APLsp.svgImage:APL1.svgImage:APLsp.svgImage:APL0.svgImage:APLsp.svgImage:APL1.svg
  7. Image:APLslash.svg: selecteer: aan de hand van de vector Image:APL1.svgImage:APLsp.svgImage:APL1.svgImage:APLsp.svgImage:APL0.svgImage:APLsp.svgImage:APL1.svg worden getallen geselecteerd uit de vector Image:APLR.svg, dus Image:APL2.svgImage:APLsp.svgImage:APL3.svgImage:APLsp.svgImage:APL4.svgImage:APLsp.svgImage:APL5.svg. Het resultaat is de vector Image:APL2.svgImage:APLsp.svgImage:APL3.svgImage:APLsp.svgImage:APL5.svg. Daarmee is het probleem opgelost.

[bewerk] Functies

Er zijn monadische functies met één argument en diadische functies met twee argumenten. De syntaxis is zoals gebruikelijk bij de klassieke wiskundige functies, bijvoorbeeld Image:APLA.svgImage:APLplus.svgImage:APLB.svg en Image:APLminus.svgImage:APLB.svg. Deze syntaxis is consequent doorgevoord voor alle functies, ook voo faculteit (uitroepteken links van de operand, niet rechts) en absolute waarde (verticale streep links van de operand, niet aan weerszijden).

Verder worden de functies onderscheiden in scalaire functies en gemengde functies. De laatste zijn in het bijzonder bedoeld voor het werken met arrays.

[bewerk] Scalaire functies

Worden scalaire functies op een array toegepast, dan werken ze op ieder element van de array apart. Men kan bijvoorbeeld twee arrays bij elkaar optellen, mits beide arrays dezelfde vorm hebben, dus arrays van evenveel dimensies met dezelfde waarden. Het rsultaat heeft weer dezelfde vorm. Bijvoorbeeld: 3 5 4 + 2 4 6 geeft 5 9 10. Hierop geldt een uitzondering: men kan een scalaire dyadische functie uitvoeren op twee arrays waarvan een een enkel getal is. Bijvoorbeeld: 3 + 2 4 6 geeft 5 7 9.

Teken Dyadisch Monadisch
Image:APLplus.svg Plus Optelling Plus onveranderd
Image:APLminus.svg Min Aftrekking Min Negatie
Image:APLtimes.svg Maal Vermenigvuldiging Teken Image:APL1.svg als argument positief is, Image:APLhighminus.svgImage:APL1.svg als argument negatief is, Image:APL0.svg als argument nul is
Image:APLdivide.svg Delen Deling Omgekeerde Omgekeerde
Image:APLceiling.svg Maximum Het grootste der twee argumenten Ceiling Het kleinste gehele getal dat niet kleiner is dan het argument
Image:APLfloor.svg Minimum Het kleinste der twee argumenten Floor Het grootste gehele getal dat niet groter is dan het argument
Image:APLstar.svg Machtsverheffen A in de macht B e-macht Macht van e
Image:APLlog.svg Logaritme Logaritme van B met grondtal A Natuurlijke logaritme Natuurlijke logaritme
Image:APLmodulus.svg Rest Rest bij deling van B door A Absolute waarde Absolute waarde
Image:APLfactorial.svg Binomiaalcoëfficiënt B \choose A Faculteit Faculteit (of gammafunctie van B+1)
Image:APLquestion.svg Willekeurig Willekeurig getal uit Image:APLiota.svgImage:APLB.svg
Image:APLcircle.svg trigonometrische functies het linker argument (tussen Image:APLhighminus.svgImage:APL7.svg en Image:APL7.svg) bepaalt welke functie wordt uitgevoerd pi maal product van pi
Logische functies: enige toegestane argumenten zijn Image:APL1.svg (true) en Image:APL0.svg (false)
Image:APLand.svg En
Image:APLor.svg Of
Image:APLnand.svg Niet en
Image:APLnor.svg Niet of
Image:APLtilde.svg Niet Verandert Image:APL1.svg in Image:APL0.svg en Image:APL0.svg in Image:APL1.svg
Vergelijkingen: het resultaat is Image:APL1.svg (true) of Image:APL0.svg (false)
Image:APLlt.svg kleiner
Image:APLle.svg kleiner of gelijk
Image:APLgt.svg groter
Image:APLge.svg groter of gelijk
Image:APLeq.svg gelijk
Image:APLne.svg ongelijk

[bewerk] Gemengde functies

Gemengde functies zijn speciaal voor het bewerken van arrays. Sommige functies kunnen zelfs van een index worden voorzien. Bijvoorbeeld Image:APLA.svgImage:APLuparrow.svgImage:APLlbracket.svgImage:APLI.svgImage:APLrbracket.svgImage:APLB.svg. In dit geval wordt de functie Image:APLA.svgImage:APLuparrow.svgImage:APLB.svg langs de index Image:APLI.svg uitgevoerd. Wordt er geen index opgegeven, dan wordt de functie langs de laatste dimensie uitgevoerd.

Teken Dyadisch Monadisch
Image:APLrho.svg Reshape Maak een array. het linkerargument bepaalt de vorm van de array, de waarden van de array komen uit het rechterargument. Dimensie Maakt een vector met de vorm van het rechterargument.
Image:APLiota.svg Zoeken Zoekt de waarden van het rechterargument in het linkerargument en geeft terug op welke positie de waarden voorkomen. Het linker argument moet een vector zijn. Index Maakt een vector met de natuurlijke getallen van 1 tot n.
Image:APLcomma.svg Catenation Een komma koppelt twee arrays aan elkaar tot een nieuwe array. Alle dimensies van de twee arrays moeten identiek zijn, behalve de dimensie waarlangs de functie wordt uitgvoerd. Dat is de laatste dimensie, tenzij een index wordt gebruikt Ravel Een monadische komma maakt een vector van het argument.
Image:APLcomma.svg Lamination Koppelt twee arrays aan elkaar tot een nieuwe array. Alle dimensies van de twee arrays moeten identiek zijn, en de nieuwe array heeft een dimensie meer, met de waarde 2. Voor deze functie is een gebroken index nodig. Bijvoorbeeld Image:APLA.svgImage:APLcomma.svgImage:APLlbracket.svgImage:APL3.svgImage:APLfullstop.svgImage:APL5.svgImage:APLrbracket.svgImage:APLB.svg koppelt de arrays tussen de 3e en 4e dimensie aan elkaar.
Image:APLuparrow.svg Take Neemt een deel uit het tweede argument, namelijk zo veel elementen als door het tweede argument is aangegegevn. Is het eerste argument positief, dan worden de eerste N elementen genomen, is het negatief, dan worden de laatste -N elementen genomen.
Image:APLdownarrow.svg Drop Verwijdert een deel uit het tweede argument, namelijk zo veel elementen als door het tweede argument is aangegegevn. Is het eerste argument positief, dan worden de eerste N elementen verwijderd, is het negatief, dan worden de laatste -N elementen verwijderd.
Image:APLslash.svg Compressie Het linker argument is een logische vector. De waarden die met een nul corresponderen worden uit het rechter argument verwijderd. Bijvoorbeeld 1 0 1 0 / 2 3 5 4 resulteert in 2 5. Compressie geschiedt langs de laatste dimensie, tenzij een index is opgegeven. Het teken Image:APLslash.svg kan niet monadisch worden gebruikt, maar vormt dan met het voorafgaande teken een gecombineerde functie. Zie volgende tabel.
Image:APLslash1.svg Compressie Hetzelfde als Image:APLslash.svgImage:APLlbracket.svgImage:APL1.svgImage:APLrbracket.svg
Image:APLbackslash.svg Expansie Het linker argument is een logische vector. In het rechterargument worden waarden tussengevoegd op de plaatsen die corresponderen met een nul in het linkerargument. Bijvoorbeeld 1 0 1 0 \ 2 5 resulteert in 2 0 5 0. Expansie geschiedt langs de laatste dimensie, tenzij een index is opgegeven.
Image:APLbackslash1.svg Expansie Hetzelfde als Image:APLbackslash.svgImage:APLlbracket.svgImage:APL1.svgImage:APLrbracket.svg.
Image:APLgradeup.svg Grade up Vector, zodanig dat Image:APLV.svgImage:APLlbracket.svgImage:APLgradeup.svgImage:APLV.svgImage:APLrbracket.svg gesorteerd is.
Image:APLgradedown.svg Grade down Vector, zodanig dat Image:APLV.svgImage:APLlbracket.svgImage:APLgradedown.svgImage:APLV.svgImage:APLrbracket.svg omgekeerd gesorteerd is.
Image:APLrotate.svg Roteren De volgorde van de elementen van het rechterargument wordt opgeschoven Omkeren Het rechterargument wordt andersom gezet
Image:APLrotate1.svg Roteren Hetzelfde als Image:APLrotate.svgImage:APLlbracket.svgImage:APL1.svgImage:APLrbracket.svg Omkeren
Image:APLmatdiv.svg Matrixdeling Omgekeerde van inwendig matrixproduct Inverse van matrix

[bewerk] Gecombineerde functies

Verder zijn er gecombineerde functies. Hierbij wordt uit een scalaire dyadische functie (of twee scalaire dyadische functies) een nieuwe gemengde functie gemaakt. In de voorbeelden hieronder kan Image:APLquad.svg worden vervangen dooe een willekeurige scalaire dyadische functie.

Teken Dyadisch Monadisch
Image:APLquad.svgImage:APLslash.svgImage:APLB.svg Reductie De dyadische functie Image:APLquad.svg wordt toegepast op de hele vector, bijvoorbeeld Image:APLplus.svgImage:APLslash.svgImage:APL3.svgImage:APLsp.svgImage:APL5.svgImage:APLsp.svgImage:APL8.svg komt overeen met Image:APL3.svgImage:APLplus.svgImage:APL5.svgImage:APLplus.svgImage:APL8.svg
Image:APLquad.svgImage:APLslash1.svgImage:APLB.svg Hetzelfde als Image:APLquad.svgImage:APLslash.svgImage:APLlbracket.svgImage:APL1.svgImage:APLrbracket.svgImage:APLB.svg
Image:APLA.svgImage:APLsmallcircle.svgImage:APLfullstop.svgImage:APLquad.svgImage:APLB.svg Uitwendig product Uitwendig product van twee arrays. Elke dyadische scalare functie kan als Image:APLquad.svg worden gebruikt.
Image:APLA.svgImage:APLquad.svgImage:APLfullstop.svgImage:APLquad.svgImage:APLB.svg Inwendig product Het gewone matrixproduct is Image:APLA.svgImage:APLplus.svgImage:APLfullstop.svgImage:APLtimes.svgImage:APLB.svg

[bewerk] Oneigenlijke functies

Teken Dyadisch Monadisch
Image:APLleftarrow.svg toekenning Het linker argument is een variabele die de waarde krijgt van het rechter argument
Image:APLrightarrow.svg sprongopdracht De uitvoering van het programma gaat verder op het aangegeven regelnummer. Is het argument een array, dan geldt het eerste element van de array. Is het argument een lege array, dan gaat de uitvoering verder met de volgende regel. Door expressies te gebruiken zijn voorwaardelijke sprongen mogelijk. Wordt naar regel nul gesprongen, dan wordt de uitvoering van de routine beëindigd.

[bewerk] In- en uitvoer

De laatste bewerking die op een regel wordt uitgevoerd, is vrijwel steeds Image:APLrightarrow.svg (sprongopdracht) of Image:APLleftarrow.svg (toekenning).

Bijvoorbeeld:
Image:APLrightarrow.svgImage:APL3.svgImage:APLplus.svgImage:APL5.svg spring naar regel 8
Image:APLA.svgImage:APLleftarrow.svgImage:APL3.svgImage:APLplus.svg