Az APL programozási nyelv

Példák


Az alábbi program az X vektorban tárolt szavakat rendezi szóhossz alapján sorba. X[X+.¬' ';]
Egy program, amely 1-től N-ig megkeresi az összes prím számot:
(~N ą N°.×N)/N „ 1‡ ĽN
A következőképpen kell olvasni jobbról-balra:
  1. Ľ N egy vektort kreál 1..N-ig (ha N=6 a program kezdetekor akkor a vektor {1,2,3,4,5,6})
  2. Eldobjuk a vektor első elemét a ‡ függvénnyel, azaz az 1-et. Vagyis 1‡ ĽN   az {2,3,4,5,6}
  3. N-et egyenlővé tesszük a kapott vektorral ( „ , megfeleltetés operátor)
  4. Descartes szorzatot készítünk NxN-nel, vagyis egy mátrixot, amelyben N minden elemét szorozzuk N miden elemével °.× függvény)
  5. Egy N hosszú vektort hozunk létre, 1-et állítva a miden pozíciójára, ahol N értéke szerepel a mátrixban ( ą tartalmazó függvény), vagyis {0,0,1,0,1}
  6. Logikailag negáljuk a kapott vektor értékét ( ~ negálás függvény), azaz {1,1,0,1,0}
  7. Kiválogatjuk azon elemeket N-ből, ahol a megfelelő érték 1 ( / függvény) vagyis {2,3,5}

Csomópontok végrehajtási ideje

Legyen egy Petri hálónk (irányított gráf, ahol a csomópontok valamilyen tevékenységek) Minden tevékenység csak akkor indulhat, ha a rá mutató nyilak csomópontjai már befejeződtek. A következő ábra egy ilyen hálót mutat, és annak reprezentációs mátrixát:

A mátrix ( MP[i;j] ) i. sorában ha a j. elemnél 1 van, akkor az i. csomópontba megy él a j-ből. Nyilvánvaló, hogy ennek a gráfnak körmentesnek kell lennie.
Van továbbá egy D vektorunk amiben a csomópontok időtartamát tároljuk.
A feladat: meghatározni, hogy mikor fog egy csomópont legkorábban elindulni és mikor fog legkésőbb befejeződni. Íme az APL forráskód, amit 1967-ben ennek a problémának a megoldására írt Montalbano:

Zsákjáték

Roger Hui által kitalált játék a következő: minden körben 12 kártyát osztunk a 81-es pakliból, amiből minden kártya különböző.
Minden kártya a következő jegyeket hordozhatja magában:
szám:    1, 2, or 3
alak:      gyémánt, ovális, kacskaringó
szín:       vörös, zöld, lila
minta:    szolid, vázlatos, homályos
Egy “zsák” 3 kártyából áll, amelyeknek egyes jellemzői vagy ugyanazok, vagy különbözőek, pl:
2-es vörös szolid gyémánt
2-es vörös vázlatos kacskaringó
2-es vörös homályos ovális
A feladat: osztani 12 lapot és minden lehetséges zsákot felkutatni.
A megoldó program (ezt csak az APL tömörsége miatt hoztam fel, nem szükségszerű első látásra megérteni):
    ’ Z„DEAL;M;R [1]    ©Deals 12 cards [2]    R„(12?81)-1 [3]    M„ł3 3 3 3‚R [2]    Z„M°.=0 1 2      ’      ’ Z„SETS H;F [1]    ©Returns all the sets in hand H [2]    F„H[3 COMBIN 12;;] [3]    Z„(^/^/2¬+/[2]F)šF      ’      ’ Z„FMT A;C [1]    ©Formats cards for display [2]    C„'1' '2' '3' 'Red' 'Green' 'Purple' 'Diamond' 'Oval' 'Squiggle' 'Filled' 'Hollow' 'Lined' [3]    Z„(Ż1‡˝A)˝(,A)/,(˝A)˝C      ’      ’ Z„HAND D;L [1]    ©Translates hand codes to the corresponding bit array [2]    D„MATRIFY D [3]    L„4 3˝'123RGPDOSFHL' [4]    Z„2 3 1łź/L°.=D      ’      ’ Z„X COMBIN Y;C;J;K;N [1]    ©Returns all possible combinations of ¸ items drawn from Ľľ [2]    © The result is origin-sensitive [3]    N„1+Y-X [4]    K„÷N  © give domain error if X=Y+1 [5]    K„(X-1)+ĽN [6]    Z„(N,×X)˝K [7]    R„N˝1 [8]   L1:…(ŚIO>1†K„K-1)/0 [9]    C„˛R„+\R [10]   J„(Ľ˝J)-J„C/+\0,1‡C [11]   Z„(C/K),Z[J;] [12]   …L1      ’     ’ Z„A MATRIFY V;D;L;I;W;M [1]    ©Forms a matrix from a vector or matrix of names ľ [2]    © The optional left argument is a vector of delimiter characters (which [3]    ©    separate the words in the right argument) [4]    © Treats multiple consecutive delimiters as a single delimiter [5]    © [6]    …(1<˝˝Z„V)/0      © return argument unchanged if it's already a matrix [7]    –(0=ŚNC 'A')/'A„'' ''' © set left arg if user didn't supply one [8]    D„VąA               © mark delimiters in V [9]    L„Ż1‡1,D            © push a 1 into the front of each group of 0's [10]   V„(I„~D)/V       © delete delimiters [11]   L„I/L [12]   I„L/Ľ˝L            © find position of the first of each name [13]   W„(1‡I,1+˝L)-I     © get the width of each name [14]   M„0——/W             © width of the widest name [15]   V„(,W°.‰ĽM)\V   © insert blanks at the end of short names [16]   Z„((˝W),M)˝V      © convert to a matrix      ’