Syntaxe a symboly APL - APL syntax and symbols

Programovací jazyk APL se vyznačuje tím, že je spíše symbolický než lexikální : jeho primitiva jsou označována symboly , nikoli slovy. Tyto symboly byly původně navrženy jako matematický zápis k popisu algoritmů. Programátoři APL často při diskusích o funkcích a operátorech (například o produktu pro × /) přiřazují neformální názvy, ale základní funkce a operátory poskytované jazykem jsou označeny netextovými symboly.

Monadické a dyadické funkce

Většina symbolů označuje funkce nebo operátory . Monadická funkce bere jako argument výsledek vyhodnocení vše na své pravé straně. (Moderováno obvyklým způsobem v závorkách.) Dyadická funkce má další argument, první položku dat nalevo. Mnoho symbolů označuje monadické i dyadické funkce, interpretované podle použití. Například ⌊3,2 dává 3, největší celé číslo, které není nad argumentem, a 3⌊2 dává 2, nižší z obou argumentů.

Funkce a operátory

APL používá pojem operátor v Heavisideově smyslu jako moderátor funkce na rozdíl od použití stejného termínu v jiném programovacím jazyce jako něco, co funguje na datech, ref. relační operátor a operátoři obecně . Jiné programovací jazyky také někdy používají tento termín zaměnitelně s funkcí , oba výrazy se však používají v APL přesněji. Rané definice symbolů APL byly velmi konkrétní v tom, jak byly symboly kategorizovány. Například operátor zmenšit je označen lomítkem a zmenší pole podél jedné osy vložením jeho funkčního operandu . Příklad snížení :

      ×/2 3 4
24
<< Ekvivalentní výsledky v APL >>
<< Zmenšit operátor / použitý vlevo
      2×3×4
24

Ve výše uvedeném případě operátor zmenšení nebo lomítko moderuje funkci násobení . Výraz × / 2 3 4 se vyhodnotí jako skalární (pouze 1 prvek) výsledek redukcí pole násobením. Výše uvedený případ je zjednodušený, představte si, že znásobíte (přidáte, odečtete nebo rozdělíte) více než jen několik čísel dohromady. (Z vektoru × / vrátí součin všech jeho prvků.)


      1 0 1\45 67
45 0 67
<< Opačné výsledky v APL >>
<< Rozbalit dyadickou funkci \ použito vlevo
Replikovat dyadickou funkci / použito vpravo >>
      1 0 1/45 0 67
45 67

Výše dyadických funkce příkladů [levý a pravý příklady] (za použití stejného / symbol, vpravo příklad) ukazují, jak logická hodnoty (0 a 1), mohou být použity jako levé argumentů pro \ expandovat a / opakovaných funkce vyrobit přesně opačné výsledky. Na levé straně je 2-element vektoru {45} 67 je rozšířena , kde booleovské 0s vyskytují za následek 3-prvek vektoru {45 0 67} - poznámka jak APL vložena 0 do vektoru. Naopak, pravý opak nastává na pravé straně - kde se ze 3-prvkového vektoru stanou jen 2-prvky; boolean 0s mazání položek pomocí funkce dyadic / slash . Symboly APL také fungují na seznamech (vektorech) položek využívajících jiné datové typy než jen číselné, například dvoučlenný vektor znakových řetězců {„Jablka“ „Oranges“} lze nahradit číselným vektorem {45 67} výše.

Pravidla syntaxe

V APL neexistuje hierarchie priorit pro funkce nebo operátory. APL nenásleduje obvyklou operátorskou prioritu jiných programovacích jazyků; například ×neváže své operandy o nic „pevněji“ než +. Místo priority operátora definuje APL pojem rozsah .

Rozsah z funkce určuje jeho argumenty . Funkce mají dlouhý pravý rozsah : to znamená, že berou jako správné argumenty vše napravo. Dyadická funkce má krátký levý rozsah : bere jako své levé argumenty první část dat nalevo. Například (sloupec úplně vlevo je skutečný programový kód z relace uživatele APL , odsazený = skutečný vstup uživatele , neodsazený = výsledek vrácený interpretem APL ):


Operátor může mít funkční nebo datové operandy a vyhodnotit je jako dyadická nebo monadická funkce. Provozovatelé již dlouho nechali působnost. Operátor bere jako svůj levý operand nejdelší funkci nalevo. Například:

Levý operand pro operátor over-each¨ je funkce index ⍳ . Odvozené funkce ⍳¨ se používá monadically a bere jako pravého operandu vektoru 3 3. Levý obor každého z nich je ukončen operátorem zmenšení , označeným lomítkem . Jeho levý operand je výraz funkce k jeho zleva: vnější produkt z rovná funkci. Výsledek ∘. = / Je monadická funkce. Při obvyklém dlouhém pravém rozsahu funkce bere jako správný argument výsledek ⍳¨3 3. Tedy



Monadické funkce

Jména Zápis Význam Bod kódu Unicode
Válec ?B Jedno celé číslo vybrané náhodně z prvních celých čísel B. U + 003F ?
Strop ⌈B Nejméně celé číslo větší nebo rovno B U + 2308
Podlaha ⌊B Největší celé číslo menší nebo rovno B U + 230A
Tvar, Rho ⍴B Počet komponent v každé dimenzi B U + 2374
Ne , Tilde ∼B Logické: ∼1 je 0, ∼0 je 1 U + 223C
Absolutní hodnota ∣B Velikost B. U + 2223
Generátor indexů, Iota ⍳B Vektor prvních celých čísel B. U + 2373
Exponenciální ⋆B e na sílu B. U + 22C6
Negace −B Změní znaménko B U + 2212 -
Sdružené +B Komplexní konjugát B (reálná čísla jsou vrácena beze změny) U + 002B +
Signum ×B ¯1 pokud B <0; 0, pokud B = 0; 1 pokud B > 0 U + 00D7 ×
Reciproční ÷B 1 děleno B U + 00F7 ÷
Ravel, katenát, laminát ,B Přetváří B do vektoru U + 002C ,
Matrix inverzní , Monadic Quad Divide ⌹B Inverzní matice B U + 2339
časy ○B Vynásobte π U + 25CB
Logaritmus ⍟B Přirozený logaritmus B. U + 235F
Obrácení ⌽B Obrátit prvky B podél poslední osy U + 233D
Obrácení ⊖B Obrátit prvky B podél první osy U + 2296
Zařadit do vyšší kategorie ⍋B Indexy B, které uspořádají B vzestupně U + 234B
Zařadit do nižší kategorie ⍒B Indexy B, které uspořádají B sestupně U + 2352
Vykonat ⍎B Proveďte výraz APL U + 234E
Monadický formát ⍕B Znaková reprezentace B U + 2355
Monadická transpozice ⍉B Otočte osy B U + 2349
Faktoriální !B Součin celých čísel 1 až B U + 0021 !

Dyadické funkce

Jména Zápis Význam
Bod kódu Unicode
Přidat A+B Součet A a B U + 002B +
Odčítat A−B Minus B U + 2212 -
Násobit A×B Násobí B U + 00D7 ×
Rozdělit A÷B A děleno B U + 00F7 ÷
Umocňování A⋆B A zvýšil na B sílu U + 22C6
Kruh A○B Trigonometrické funkce B vybrané pomocí A
A=1: sin(B)    A=5: sinh(B)
A=2: cos(B)    A=6: cosh(B)
A=3: tan(B)    A=7: tanh(B)

Negativy produkují inverzní funkce

U + 25CB
Obchod A?B A odlišné celá čísla vybraných náhodně z prvních B celá čísla U + 003F ?
Členství, Epsilon A∈B 1 pro prvky A přítomné v B ; 0 kde ne. U + 2208
Najít, Epsilon Underbar A⍷B 1 pro počáteční bod vícepoložkového pole A přítomného v B ; 0 kde ne. U + 2377
Maximum , strop A⌈B Čím větší je hodnota A nebo B. U + 2308
Minimum , podlaha A⌊B Menší hodnota A nebo B. U + 230A
Přetvořit, Dyadic Rho A⍴B Pole tvaru A s daty B U + 2374
Vzít A↑B Vyberte první (nebo poslední) A prvek B podle × A U + 2191
Upustit A↓B Vyjměte první (nebo poslední) A prvky B podle x A U + 2193
Dekódovat A⊥B Hodnota polynomu, jehož koeficienty jsou B v A U + 22A5
Zakódovat A⊤B Base - Reprezentace hodnoty B U + 22A4
Zbytek A∣B B modulo A U + 2223
Katenace A,B Prvky B připojené k prvkům A U + 002C ,
Expanze, Dyadic Backslash A\B Vložte nuly (nebo mezery) do B odpovídající nulám v A. U + 005C \
Komprese, Dyadic Slash A/B Vyberte prvky v B odpovídající těm v A U + 002F /
Rejstřík, Dyadic Iota A⍳B Umístění (index) B v A ; pokud není nalezen 1+⍴A U + 2373
Maticový předěl, Dyadic Quad předěl A⌹B Řešení systému lineárních rovnic , vícenásobná regrese A x = B U + 2339
Otáčení A⌽B Prvky B jsou otočené polohy A. U + 233D
Otáčení A⊖B Prvky B jsou otočené polohy A podél první osy U + 2296
Logaritmus A⍟B Logaritmus B k základně A U + 235F
Dyadický formát A⍕B Formátujte B do matice znaků podle A U + 2355
Obecné provedení A⍉B Osy B jsou seřazeny podle A U + 2349
Kombinace A!B Počet kombinací B užívaných A najednou U + 0021 !
Diaeresis, Dieresis, Double-Dot A¨B Přes každého, nebo provést každý zvlášť; B = na těchto; A = operace k provedení nebo použití (např. Iota) U + 00A8 ¨
Méně než A < B Srovnání: 1, pokud je pravda, 0, pokud je nepravda U + 003C <
Méně než nebo rovno A≤B Srovnání: 1, pokud je pravda, 0, pokud je nepravda U + 2264
Rovnat se A=B Srovnání: 1, pokud je pravda, 0, pokud je nepravda U + 003D =
Větší nebo rovno A≥B Srovnání: 1, pokud je pravda, 0, pokud je nepravda U + 2265
Větší než A>B Srovnání: 1, pokud je pravda, 0, pokud je nepravda U + 003E >
Není to stejné A≠B Srovnání: 1, pokud je pravda, 0, pokud je nepravda U + 2260
Nebo A∨B Booleovská logika: 0 (nepravda) pokud oba a B = 0 , 1 jinak. Alt: 1 (True), pokud A nebo B = 1 (True) U + 2228
A A∧B Booleovská logika: 1 (True), jestliže obě a B = 1 , 0 (nepravda) jinak U + 2227
Ani A⍱B Logická logika: 1, pokud A i B jsou 0, jinak 0. Alt: ~ ∨ = ne Or U + 2371
Nand A⍲B Logická logika: 0, pokud A i B jsou 1, jinak 1. Alt: ~ ∧ = ne And U + 2372
Vlevo, odjet A⊣B A U + 22A3
Že jo A⊢B B U + 22A2

Operátory a indikátor osy

Jména Symbol Příklad Význam (příkladu) Sekvence kódových bodů Unicode
Zmenšit (poslední osa), lomítko / +/B Součet přes B U + 002F /
Zmenšit (první osa) +⌿B Sečtěte B U + 233F
Skenování (poslední osa), zpětné lomítko \ +\B Klouzavý součet přes B. U + 005C \
Skenovat (první osa) +⍀B Klouzavý součet dolů B U + 2340
Vnitřní produkt . A+.×B Matrix produkt z A a B U + 002E .
Vnější produkt ∘. A∘.×B Vnější produkt z A a B U + 2218 , U + 002E .

Poznámky: Operátoři zmenšení a skenování očekávají dyadickou funkci nalevo a vytvoří monadickou složenou funkci aplikovanou na vektor napravo.

Provozovatel produktu „.“ očekává dyadickou funkci jak na levé, tak na pravé straně, čímž se vytvoří dyadická složená funkce aplikovaná na vektory na levé a pravé straně. Pokud je funkce nalevo od tečky „∘“ (znamená null), pak je složená funkce vnějším produktem, jinak je vnitřním produktem. Vnitřní produkt určený pro konvenční násobení matic používá funkce + a ×, jejichž nahrazení jinými dyadickými funkcemi může vést k užitečným alternativním operacím.

Za některými funkcemi může následovat indikátor osy v (hranatých) závorkách, tj. Objeví se mezi funkcí a polem a neměl by být zaměňován s indexy pole napsanými za polem. Například vzhledem k funkci ⌽ (obrácení) a dvourozměrnému poli funguje funkce ve výchozím nastavení podél poslední osy, ale to lze změnit pomocí indikátoru osy:


V konkrétním případě, pokud za funkcí dyadic catenate “ „ následuje indikátor osy (nebo modifikátor osy na symbol / funkci), lze ji použít k laminování (vložení) dvou polí v závislosti na tom, zda je indikátor osy menší než nebo větší než počátek indexu ( počátek indexu = 1 na obrázku níže):

Vnořená pole

Pole jsou struktury, které mají prvky seskupené lineárně jako vektory nebo ve formě tabulky jako matice - a vyšší dimenze (3D nebo krychle, 4D nebo krychle v průběhu času atd.). Pole obsahující znaky i čísla se nazývají smíšená pole . Struktury polí obsahující prvky, které jsou také maticemi, se nazývají vnořená pole .

Vytváření vnořeného pole
Uživatelská relace s překladačem APL Vysvětlení
      X4 5⍴⍳20
      X
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
      X[2;2]
7
      ⎕IO
1
      X[1;1]
1


X set = matice se 4 řádky o 5 sloupcích, skládající se z 20 po sobě jdoucích celých čísel.

Prvek X [2; 2] v řádku 2 - sloupci 2 je aktuálně celé číslo = 7 .

Počáteční počátek indexu valueIO hodnota = 1 .

První prvek v matici X nebo X [1; 1] = 1 .

      X[2;2]"Text"
      X[3;4](2 2⍴⍳4)
      X
  1    2  3      4    5
  6 Text  8      9   10

 11   12 13    1 2   15
               3 4

 16   17 18     19   20
Prvek v X [řádek 2; col 2] se změní (z 7) na vnořený vektor "Text" pomocí funkce enclose ⊂ .


Prvek v X [řádek 3; col 4], dříve celé číslo 14, se nyní stává mini uzavřenou nebo ⊂ vnořenou maticí 2x2 se 4 po sobě jdoucími celými čísly.

Protože X obsahuje čísla , text a vnořené prvky , jedná se o smíšené i vnořené pole.

Vizuální reprezentace vnořeného pole

Řízení toku

Uživatel může definovat vlastní funkce, které, stejně jako proměnné, jsou identifikovány podle názvu spíše než non-textového symbolu. Tyto hlavičky funkce určuje, zda je uživatelská funkce niladic (bez argumentů), monadická (jediná správná argumentace) nebo dyadická (vlevo a vpravo argumenty), místní název výsledku (vlevo z ← přiřadit šipka), a to, zda má jakékoli místní proměnné (každá oddělená středníkem ';').

Uživatelské funkce
Niladic funkce PI nebo π (pi) Monadická funkce CIRCLEAREA Dyadická funkce SEGMENTAREA s lokálními proměnnými
  RESULTPI
   RESULT1
 
  AREACIRCLEAREA RADIUS
   AREAPI×RADIUS2
 
  AREADEGREES SEGMENTAREA RADIUS ; FRACTION ; CA
   FRACTIONDEGREES÷360
   CACIRCLEAREA RADIUS
   AREAFRACTION×CA
 

Zda jsou funkce se stejným identifikátorem, ale odlišnou adicitou odlišné, je definováno implementací. Pokud je to povoleno, pak by mohla být funkce CURVEAREA definována dvakrát, aby nahradila jak monadic CIRCLEAREA, tak dyadic SEGMENTAREA výše, přičemž monadická nebo dyadická funkce byla vybrána kontextem, na který byla odkazována.

Vlastní dyadické funkce lze obvykle použít na parametry se stejnými konvencemi jako vestavěné funkce, tj. Pole by měla mít buď stejný počet prvků, nebo jedno z nich by mělo mít jeden rozšířený prvek. Existují výjimky z toho, například funkce převodu před desetinné britské měny na dolary by očekávala převzetí parametru s přesně třemi prvky představujícími libry, šilinky a pence.

Uvnitř programu nebo vlastní funkce lze ovládací prvek podmíněně přenést na příkaz označený číslem řádku nebo explicitním štítkem; je-li cíl 0 (nula), program se tím ukončí nebo se vrátí volající funkce. Nejběžnější forma používá funkci komprese APL, jako v šabloně (podmínka) / cíl, která má za následek vyhodnocení podmínky na 0 (nepravda) nebo 1 (pravda) a poté ji použít k maskování cíle (pokud je podmínka false je ignorován, pokud je true, je ponechán sám, takže je přenesena kontrola).

Proto lze funkci SEGMENTAREA upravit tak, aby se přerušila (těsně pod), vrací nulu, pokud mají parametry (DEGREES a RADIUS níže) různá znaménka:

 AREADEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN     ⍝ local variables denoted by semicolon(;)
  FRACTIONDEGREES÷360
  CACIRCLEAREA RADIUS        ⍝ this APL code statement calls user function CIRCLEAREA, defined up above.
  SIGN(×DEGREES)≠×RADIUS     ⍝ << APL logic TEST/determine whether DEGREES and RADIUS do NOT (≠ used) have same SIGN 1-yes different(≠), 0-no(same sign)
  AREA0                      ⍝ default value of AREA set = zero
  SIGN/0                     ⍝ branching(here, exiting) occurs when SIGN=1 while SIGN=0 does NOT branch to 0.  Branching to 0 exits function.
  AREAFRACTION×CA

Výše uvedená funkce SEGMENTAREA funguje podle očekávání, pokud jsou parametry skaláry nebo pole s jedním prvkem , ale ne, pokud se jedná o pole s více prvky, protože podmínka je nakonec založena na jednom prvku pole SIGN - na druhé straně uživatel funkci lze upravit tak, aby správně zpracovávala vektorizované argumenty. Operace může být někdy nepředvídatelná, protože APL definuje, že počítače s možnostmi vektorového zpracování by se měly paralelizovat a pokud je to možné, mohou změnit pořadí operací pole - proto testujte a laděte uživatelské funkce, zejména pokud budou použity s vektorovými nebo dokonce maticovými argumenty. To ovlivňuje nejen explicitní použití vlastní funkce na pole, ale také její použití kdekoli, kde lze rozumně použít dyadickou funkci, například při generování tabulky výsledků:

        90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4
0 0 0
0 0 0
0 0 0
0 0 0

Stručnějším způsobem a někdy i lepším způsobem - formulovat funkci je vyhnout se explicitním přenosům řízení, místo toho používat výrazy, které se správně vyhodnotí za všech nebo očekávaných podmínek. Někdy je správné nechat funkci selhat, když je jeden nebo oba vstupní argumenty nesprávné - přesně proto, aby uživatel věděl, že jeden nebo oba použité argumenty byly nesprávné. Následující text je stručnější než výše uvedená funkce SEGMENTAREA. Níže je důležité správně zpracovat vektorizované argumenty:

  AREADEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN
   FRACTIONDEGREES÷360
   CACIRCLEAREA RADIUS
   SIGN(×DEGREES)≠×RADIUS
   AREAFRACTION×CA×~SIGN  ⍝ this APL statement is more complex, as a one-liner - but it solves vectorized arguments: a tradeoff - complexity vs. branching
 

        90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4
0.785398163 0           12.5663706
1.57079633  0           25.1327412
2.35619449  0           37.6991118
0           ¯3.14159265 0

Vyhýbání se explicitním převodům řízení, které se také nazývá větvení, pokud nejsou kontrolovány nebo pečlivě kontrolovány - může podpořit použití příliš složitých liniových linek , opravdově „nepochopených a složitých idiomů“ a stylu „pouze pro zápis“, který udělal málo pro to, aby si APL oblíbil vlivné komentátoři jako Edsger Dijkstra . Naopak idiomy APL mohou být zábavné, vzdělávací a užitečné - pokud jsou použity s užitečnými komentáři ⍝ , například včetně zdroje a zamýšleného významu a funkce idiomu. Zde je seznam APL idiomy , což je IBM APL2 idiomy seznam zde a finský APL knihovna idiom zde .

Smíšený

Různé symboly
Jména Symbol Příklad Význam (příkladu) Bod kódu Unicode
Vysoké mínus ¯ ¯3 Označuje záporné číslo U + 00AF ¯
Lampa, komentář ⍝This is a comment Vše napravo od ⍝ označuje komentář U + 235D
RightArrow, Branch, GoTo →This_Label → This_Label odešle spuštění APL do This_Label: U + 2192
Přiřadit, LeftArrow, Nastavit na B←A B ← A nastaví hodnoty a tvar B tak, aby odpovídaly A. U + 2190

Většina implementací APL podporuje řadu systémových proměnných a funkcí, kterým obvykle předchází znak ⎕ (quad) a nebo „)“ ( hook = zavřít závorky). Obzvláště důležitá a široce implementovaná je proměnná ⎕IO ( Index Origin ), protože zatímco původní IBM APL založil svá pole na 1, některé novější varianty je založily na nule:

Uživatelská relace s překladačem APL Popis
        X12
        X
1 2 3 4 5 6 7 8 9 10 11 12
        ⎕IO
1
        X[1]
1

X set = na vektor 12 po sobě jdoucích celých čísel.

Počáteční počátek indexu valueIO hodnota = 1 . První poloha ve vektoru X nebo X [1] = 1 na vektor iota hodnot { 1 2 3 4 5 ...}.

        ⎕IO0
        X[1]
2
        X[0]
1
Počátek indexu ⎕IO se nyní změnil na 0. Proto se „první pozice indexu“ ve vektoru X změní z 1 na 0. Následně X [1] poté odkazuje nebo ukazuje na 2 z {1 2 3 4 5 ...} a X [0] nyní odkazuje na 1 .
        ⎕WA
41226371072
Quad WA nebo ⎕WA , další dynamická systémová proměnná , ukazuje, kolik pracovní oblasti zůstává nevyužito nebo 41 226 megabajtů nebo asi 41 gigabajtů nevyužité další celkové volné pracovní plochy dostupné pro pracovní prostor APL a program, který se má zpracovávat. Pokud je toto číslo nízké nebo se blíží nule - může počítač pro zvýšení virtuální paměti potřebovat více paměti RAM (RAM), místa na pevném disku nebo jejich kombinaci .
        )VARS
X
) VARS a systémová funkce v APL, ) VARS zobrazuje názvy uživatelských proměnných existující v aktuálním pracovním prostoru.

Uživatelé mají k dispozici také systémové funkce pro uložení aktuálního pracovního prostoru, např. ) ULOŽIT a ukončit prostředí APL, např. ) VYPNUTO - někdy nazývané příkazy nebo funkce zavěšení kvůli použití úvodní pravé závorky nebo zavěšení. Existuje určitá standardizace těchto funkcí quad a hook.

Písma

Základní vícejazyčná rovina Unicode obsahuje symboly APL v bloku Různé technické , které se tak obvykle vykreslují přesně z větších písem Unicode nainstalovaných s většinou moderních operačních systémů. Tato písma zřídka navrhují typografové obeznámení s APL glyfy. Přestože jsou glyfy přesné, mohou se programátorům APL zdát neznámé nebo je obtížné je od sebe odlišit.

Některá písma Unicode byla navržena pro dobré zobrazení APL: APLX Upright, APL385 Unicode a SimPL.

Před Unicode byly tlumočníkům APL dodávány fonty, ve kterých byly APL znaky mapovány na méně často používané pozice v znakových sadách ASCII, obvykle v horních 128 kódových bodech. Tato mapování (a jejich národní variace) byla někdy jedinečná pro každého tlumočníka dodavatele APL, díky kterému bylo zobrazování programů APL na webu v textových souborech a příručkách - často problematické.

Funkce klávesnice APL2 na mapování symbolů

Klávesnice APL2
Klávesnice APL2

Všimněte si tlačítka APL Zapnuto / Vypnuto - klíč úplně vpravo, těsně pod ním. Také si všimněte, klávesnice nějaké 55 unikátních (68 uvedena na výše uvedených tabulkách, včetně srovnávacích symbolů, ale některé symboly v obou Monadické a dyadických tabulek) APL symbol klíče (55 APL funkcí (operátorů) jsou uvedeny v IBM 5110 APL Reference Manual), čímž s použitím kláves alt, shift a ctrl - teoreticky by to umožnilo maximálně asi 59 (kláves) * 4 (se stiskem 2 kláves) * 3 (se stiskem tří kláves, např. ctrl-alt-del) nebo nějakých 472 různých maximálních kombinací kláves, blížících se maximálně 512 znakům EBCDIC (256 znaků krát 2 kódy pro každou kombinaci kláves). Teoreticky by klávesnice na obrázku níže umožnila aktivní vstup přibližně 472 různých APL symbolů / funkcí. V praxi dřívější verze používaly pouze něco, co zhruba odpovídalo 55 speciálním symbolům APL (kromě kláves s písmeny, čísly, interpunkcí atd.). Rané APL tedy tehdy využívalo pouze asi 11% (55/472) potenciálu využití symbolického jazyka v daném čase, na základě limitů # kláves klávesnice, opět s vyloučením čísel, písmen, interpunkce atd. V jiném smyslu symboly klávesnice využití bylo blíže 100%, vysoce efektivní, protože EBCDIC povolil pouze 256 odlišných znaků a ASCII pouze 128.

Řešení hádanek

APL se ukázal jako mimořádně užitečný při řešení matematických hádanek, z nichž některé jsou popsány níže.

Pascalův trojúhelník

Vezměte Pascalův trojúhelník , což je trojúhelníková řada čísel, ve kterých jsou na koncích řádků 1 a každé z ostatních čísel je součtem nejbližších dvou čísel v řádku těsně nad ním (vrchol, 1, je na vrchol). Následuje jednorázová funkce APL pro vizuální zobrazení Pascalova trojúhelníku:

      Pascal{0~¨⍨a⌽⊃⌽∊¨0,¨¨a!¨a⌽⍳}   ⍝ Create one-line user function called Pascal
      Pascal 7                            ⍝ Run function Pascal for seven rows and show the results below:
                     1                       
                 1       2                   
             1       3       3               
          1      4       6       4           
       1     5       10      10      5       
    1     6      15      20      15      6   
 1     7     21      35      35      21     7

Prvočísla, protiklad prostřednictvím faktorů

Určete počet prvočísel (prvočíslo je přirozené číslo větší než 1, které nemá žádné kladné dělitele jiné než 1 a samo o sobě) až do určitého počtu N. Ken Iversonovi je připsáno následující jednorázové řešení APL problému:

      ⎕CR 'PrimeNumbers'  ⍝ Show APL user-function PrimeNumbers
PrimesPrimeNumbers N     ⍝ Function takes one right arg N (e.g., show prime numbers for 1 ... int N)
Primes(2=+0=(N)∘.|⍳N)/N  ⍝ The Ken Iverson one-liner
      PrimeNumbers 100    ⍝ Show all prime numbers from 1 to 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
      PrimeNumbers 100
25                       ⍝ There are twenty-five prime numbers in the range up to 100.

Zkoumání konverzace nebo opaku matematického řešení je často nutné ( celočíselné faktory čísla ): U podmnožiny celých čísel od 1 do 15 prokažte, že nejsou prvočíselná , uvedením jejich rozkladných faktorů . Jaké jsou jejich non-one faktory (# je dělitelné, kromě 1)?

      ⎕CR 'ProveNonPrime'
ZProveNonPrime R
⍝Show all factors of an integer R - except 1 and the number itself,
⍝ i.e., prove Non-Prime. String 'prime' is returned for a Prime integer.
Z(0=(R)|R)/R  ⍝ Determine all factors for integer R, store into Z
Z(~(Z1,R))/Z   ⍝ Delete 1 and the number as factors for the number from Z.
(0=⍴Z)/ProveNonPrimeIsPrime               ⍝ If result has zero shape, it has no other factors and is therefore prime
ZR,(" factors(except 1) "),(Z),⎕TCNL  ⍝ Show the number R, its factors(except 1,itself), and a new line char
0  ⍝ Done with function if non-prime
ProveNonPrimeIsPrime: ZR,(" prime"),⎕TCNL  ⍝ function branches here if number was prime

      ProveNonPrime ¨15      ⍝ Prove non primes for each(¨) of the integers from 1 through 15 (iota 15)
    1  prime
    2  prime
    3  prime
    4  factors(except 1)   2 
    5  prime
    6  factors(except 1)   2 3 
    7  prime
    8  factors(except 1)   2 4 
    9  factors(except 1)   3 
    10  factors(except 1)   2 5 
    11  prime
    12  factors(except 1)   2 3 4 6 
    13  prime
    14  factors(except 1)   2 7 
    15  factors(except 1)   3 5

Fibonacciho sekvence

Vytvořte Fibonacciho číselnou sekvenci, kde každé následující číslo v sekvenci je součtem předchozích dvou:

      ⎕CR 'Fibonacci'              ⍝ Display function Fibonacci
FibonacciNumFibonacci Nth;IOwas   ⍝ Funct header, funct name=Fibonacci, monadic funct with 1 right hand arg Nth;local var IOwas, and a returned num.
⍝Generate a Fibonacci sequenced number where Nth is the position # of the Fibonacci number in the sequence.  << function description
IOwas⎕IO  ⎕IO0  FibonacciNum0 1↓↑+.×/Nth/2 21 1 1 0  ⎕IOIOwas   ⍝ In order for this function to work correctly ⎕IO must be set to zero.

      Fibonacci¨14    ⍝ This APL statement says: Generate the Fibonacci sequence over each(¨) integer number(iota or ⍳) for the integers 1..14.
0 1 1 2 3 5 8 13 21 34 55 89 144 233   ⍝ Generated sequence, i.e., the Fibonacci sequence of numbers generated by APL's interpreter.

Další čtení

  • Polivka, Raymond P .; Pakin, Sandra (1975). APL: Jazyk a jeho použití . Prentice-Hall. ISBN 978-0-13-038885-8.
  • Reiter, Clifford A .; Jones, William R. (1990). APL s matematickým přízvukem (1. vyd.). Taylor & Francis. ISBN 978-0534128647.
  • Thompson, Norman D .; Polivka, Raymond P. (2013). APL2 v hloubce (Springer Series in Statistics) (brožovaný výtisk) (dotisk původního 1. vydání). Springer. ISBN 978-0387942131.
  • Gilman, Leonard; Rose, Allen J. (1976). APL: Interaktivní přístup (brožovaný výtisk) (3. vydání). ISBN 978-0471093046.

Viz také

Reference

externí odkazy

Obecné online výukové programy

Pravidla syntaxe