Suora toiminto - Direct function

Suora toiminto ( dfn , lausutaan "Dee hauskaa") on vaihtoehtoinen tapa määrittää funktion ja operaattori (a korkeamman asteen funktiota ) on ohjelmointikieli APL . Suoraa operaattoria voidaan kutsua myös dopiksi (lausutaan "dee op"). John Scholes keksi ne vuonna 1996. Ne ovat ainutlaatuinen yhdistelmä matriisiohjelmointia , korkeamman asteen toimintoja ja toiminnallisia ohjelmointeja , ja ne ovat merkittävä erotus 21. vuosisadan alun APL: lle verrattuna aiempiin versioihin.

Dfn on sekvenssi mahdollisesti suojattava lausekkeita (tai vain suojusta) välillä {ja }, jotka on erotettu tai uusia-linjat, jolloin merkitsee vasemmalle argumentti ja oikealle, ja merkitsee rekursio (toiminto itse-referenssi). Esimerkiksi funktio PTtestaa, onko kukin rivi on Pythagoralaisen tripletti (testaamalla, onko neliösumma on yhtä suuri kuin kaksi kertaa neliön maksimi).

   PT {(+/*2)=2×(/)*2}
   PT 3 4 5
1
   x
 4  5  3
 3 11  6
 5 13 12
17 16  8
11 12  4
17 15  8
   PT x
1 0 1 0 0 1

Kertoma toiminto kuin dfn:

   fact {0=⍵:1  × -1}
   fact 5
120
   fact¨ 10    ⍝ fact applied to each element of 0 to 9
1 1 2 6 24 120 720 5040 40320 362880

Kuvaus

Dfns -säännöt on tiivistetty seuraavalla "viitekortilla":

{ function } {⍺⍺ operator ⍵⍵} :   vartija
  vasen argumentti ⍺⍺  vasen operandi ::  virhesuoja
  oikea argumentti ⍵⍵  oikea operandi   vasen oletus argumentti 
  itseviittaus   ∇∇  itseviittaus   s  ujo tulos

Dfn on mahdollisesti suojattujen lausekkeiden sekvenssi (tai vain vartija) rivien välillä {ja }, erotettuna tai uusilla riveillä.

expression
guard: expression
guard:

Lausekkeet ja/tai suojukset arvioidaan järjestyksessä. Vartijan on arvioitava 0 tai 1; siihen liittyvä lauseke arvioidaan, jos arvo on 1. A dfn päättyy ensimmäisen suojaamattoman lausekkeen jälkeen, joka ei pääty tehtävään , tai ensimmäisen suojatun lausekkeen jälkeen, jonka vartija arvioi arvoksi 1, tai jos lausekkeita ei enää ole. Dfn: n tulos on viimeksi arvioidun lausekkeen tulos. Jos viimeksi arvioitu lauseke päättyy tehtävään, tulos on "ujo" - sitä ei näytetä automaattisesti istunnossa.

Dfn: ssä annetut nimet ovat oletusarvoisesti paikallisia , ja niillä on sanallinen laajuus .

merkitsee vasenta funktion argumenttia ja oikeaa; ⍺⍺tarkoittaa vasenta operandia ja ⍵⍵oikeaa. Jos ⍵⍵määritelmässä esiintyy, dfn on dyadinen operaattori ; jos vain ⍺⍺tapahtuu, mutta ei ⍵⍵, niin se on monadinen operaattori; jos kumpikaan ⍺⍺tai ⍵⍵tapahtuu, dfn on funktio.

Erityistä syntaksia käytetään antamaan oletusarvo vasemmanpuoleiselle argumentille, jos dfn kutsutaan monadisesti eli soitetaan ilman vasenta argumenttia. Sitä ei arvioida muuten. expressionexpression

tarkoittaa funktion rekursiota tai itseviittausta ja ∇∇operaattorin itseviittausta. Tällainen merkintä mahdollistaa nimettömän rekursion .

Virhe ansastusta on kautta virhe-vartijoita, . Kun virhe luodaan, järjestelmä etsii dynaamisesti kutsutoimintojen kautta virhettä vastaavaa virhesuojaa. Jos sellainen löydetään, suoritusympäristö puretaan tilaan juuri ennen virhesuojaimen suorittamista ja siihen liittyvä virhesuojelulauseke arvioidaan dfn: n tuloksena. errnums::expression

Lisää kuvauksia, selityksiä ja opetusohjelmia dfns -tiedostoista on saatavilla viitattuissa artikkeleissa.

Esimerkkejä

Tässä olevat esimerkit kuvaavat dfns: n eri näkökohtia. Muita esimerkkejä on viitattuissa artikkeleissa.

Oletusvasen argumentti

Toiminto lisää ja ( i tai -1 ) kertaa . {+0j1×}0j1

   3 {+0j1×} 4
3J4
   ∘.{+0j1×} ¯2+⍳5
¯2J¯2 ¯2J¯1 ¯2 ¯2J1 ¯2J2
¯1J¯2 ¯1J¯1 ¯1 ¯1J1 ¯1J2
 0J¯2  0J¯1  0  0J1  0J2
 1J¯2  1J¯1  1  1J1  1J2
 2J¯2  2J¯1  2  2J1  2J2

Tämän toiminnon merkitys voidaan nähdä seuraavasti:

Monimutkaiset luvut voidaan rakentaa reaalilukujen järjestettyinä pareina, samalla tavalla kuin kokonaislukuja voidaan rakentaa järjestettyinä luonnollisien numeroiden pareiksi ja järkeviä numeroita kokonaislukujen pariksi. Monimutkaisilla numeroilla on sama rooli kuin kokonaisluvuilla ja rationaaliluvuilla.{+0j1×}-÷

Lisäksi funktion monadinen määritelmä on hyödyllinen monadisen ⇔ ( negatiivin ) ja monadisen ⇔ ( vastavuoroisen ) vastaavan funktion määrittämisen yhteydessä, mikä tapahtuu määrittämällä oletusarvo 0 : jos , niin ⇔ ⇔ . -0-÷1÷j{0 +0j1×}j 0 j 0+0j1×

   j{0  +0j1×}

   3 j 4 ¯5.6 7.89
3J4 3J¯5.6 3J7.89

   j 4 ¯5.6 7.89
0J4 0J¯5.6 0J7.89

   sin 1
   cos 2
   Euler {(*j ) = (cos ) j (sin )}

   Euler (¯0.5+?100) j (¯0.5+?100)
1 1 1 1 1 1 1 1 1 1

Viimeinen lauseke kuvaa Eulerin kaavaa kymmenestä satunnaisluvusta, joiden välissä on todellisia ja kuvitteellisia osia .

Yksittäinen rekursio

Cantor -sarjan kolmiosainen rakenne alkaa aikavälillä [0,1] ja kussakin vaiheessa poistaa keskimmäisen kolmanneksen jokaisesta jäljellä olevasta alivälistä:

Cantor -järjestys määritellään dfn:

   Cantor {0=⍵:,1  ,1 0 1 ∘.  -1}

   Cantor 0
1
   Cantor 1
1 0 1
   Cantor 2
1 0 1 0 0 0 1 0 1
   Cantor 3
1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1

Cantor 0 - Cantor 6 on kuvattu mustina palkeina:

Cantor seitsemässä iteraatiossa.svg

Funktio laskee bittivektorin, jonka pituus on niin, että bitti (for ja ) on 1, jos ja vain jos on alkuluku . sieve i0ii<i

sieve{
  4⍵:⍵0 0 1 1
  r0.5*n
  p2 3 5 7 11 13 17 19 23 29 31 37 41 43
  p(1+(n≤×p)1)p
  b 0@1  {(m)>m1  mn×≢} 1,p
  {r<qb1:bb[]1  b[q,q×⍸bn÷q]0   ,q}p
}

   10 10  sieve 100
0 0 1 1 0 1 0 1 0 0
0 1 0 1 0 0 0 1 0 1
0 0 0 1 0 0 0 0 0 1
0 1 0 0 0 0 0 1 0 0
0 1 0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 1
0 1 0 0 0 0 0 1 0 0
0 1 0 1 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0 0

   bsieve 1e9
   b
1000000000
   (10*⍳10) (+)0 1 b
0 4 25 168 1229 9592 78498 664579 5761455 50847534

Viimeinen sekvenssi, alkukertojen määrä pienempi kuin 10, on OEIS : n ensimmäinen osa A006880 . Viimeinen numero, 50847534, on alukkeiden määrä alle . Sitä kutsutaan Bertelsenin numeroksi, jota MathWorld kuvasi muistoksi "virheelliseksi nimeksi, joka on virheellisesti annettu virheellisen arvon " perusteella.

sievekäyttää kahta eri menetelmää komposiittien merkitsemiseen 0 -arvoilla, molemmat käyttäen paikallisia anonyymejä dfns -tiedostoja: Ensimmäinen käyttää Eratosthenes -seulaa 1 -alkamaskin ja alukkeiden etuliitteen 2 3 ... 43 avulla insert -operaattorin avulla ( oikea taitto ). (Etuliitteen pituus saadaan vertaamalla primorial -funktiota .) Toinen löytää pienimmän uuden alkutuloksen, joka on jäljellä ( ): ssa, ja asettaa itselleen 0 -bittisen ja bittien ajoittain numerot jäljellä olevilla 1 bitillä ( ): n ensimmäisessä segmentissä . Tämä toinen dfn käyttää hännän rekursiota. ×pqbqb1qqbbn÷q

Hännän rekursio

Yleensä tekijäfunktio määritellään rekursiivisesti (kuten yllä ), mutta se voidaan koodata hyödyntämään hännän rekursiota käyttämällä akun vasen -argumenttia:

fac{1  =0:⍺  (×)  -1}

Samoin tekijä neliön monimutkainen matriisi Gaussin eliminointia voidaan laskea hännän rekursio:

det{                ⍝ determinant of a square complex matrix
  1                ⍝ product of co-factor coefficients so far
  0=≢⍵:⍺             ⍝ result for 0-by-0
  (i j)()⊤⊃⍒|,   ⍝ row and column index of the maximal element
  k⍳≢
  (×[i;j]ׯ1*i+j)  [k~i;k~j] - [k~i;j] ∘.× [i;k~j]÷[i;j]
}

Useita rekursioita

Osio ei-negatiivinen kokonaisluku, on vektori positiivisia kokonaislukuja niin, että silloin, kun tilaa ei ole merkittävä. Esimerkiksi ja ovat osioita 4, ja ja ja niitä pidetään samoina osioina. n = +v2 22 1 12 1 11 2 11 1 2

Osion toiminto laskee osioiden määrä. Toiminto kiinnostaa lukuteoriaa , jota ovat tutkineet Euler , Hardy , Ramanujan , Erdős ja muut. Toistumissuhde

johdettu Eulerin viisikulmaisesta lukulauseesta . Dfn -muodossa kirjoitettu:

   pn   {1⍵:0  -+¨rec }
   rec  { - (÷2 (×1) ¯1 1 ∘.+ 3×) 1+⍳⌈0.5*×2÷3}

   pn 10
42
   pn¨ 13    ⍝ OEIS A000041
1 1 2 3 5 7 11 15 22 30 42 56 77

Perusteella askel todetaan, että , tuloksena toiminto on , 1 jos ⍵ on 0 tai 1 ja 0 muutoin. Rekursiivinen vaihe on erittäin moninkertainen rekursiivinen. Seurauksena on esimerkiksi, että toimintoa sovelletaan kaikkiin elementteihin , jotka ovat: 1⍵:010pn 200rec 200

   rec 200
199 195 188 178 165 149 130 108 83 55 24 ¯10
198 193 185 174 160 143 123 100 74 45 13 ¯22

ja sen laskeminen vaatii maailmankaikkeuden ikää kauemmin ( funktio kutsuu itseään). Laskenta-aikaa voidaan lyhentää muistiinpanolla , joka on tässä toteutettu suorana operaattorina (korkeamman asteen toiminto) : pn 200M

M{
  f⍺⍺
  i2+'⋄'t2↓,⎕cr 'f'
  '{T←(1+⍵)⍴¯1 ⋄ ',(it),'¯1≢T[⍵]:⊃T[⍵] ⋄ ⊃T[⍵]←⊂',(it),'⍵}⍵'
}

   pn M 200
3.973E12
   0  pn M 200  ⍝ format to 0 decimal places
 3972999029388

Tämä arvo vastaa Hardyn ja Ramanujanin vuonna 1918 laskemaa arvoa . pn M 200

Muistio operaattori Mmäärittää muunnos sen operandin funktio ⍺⍺käyttää välimuistiin T ja sitten arvioi sen. Operandin pnkanssa variantti on:

{T(1+)¯1  {1⍵:0  ¯1T[]:T[]  T[]⊂-+¨rec }}

Suora operaattori (dop)

Pikavalinta matriisissa toimii valitsemalla "pivot" satunnaisesti sen tärkeimpien solujen joukosta ja sitten kataenimalla lajitellut pääsolut , jotka ovat ehdottomasti pivotia edellä, tärkeimmät solut, jotka ovat yhtä suuret kuin pivot, ja lajitellut pääsolut, jotka seuraavat tarkasti niveltä, kuten määritetään vertailutoiminnolla ⍺⍺. Suora operaattori (dop) Q:

   Q{1≥≢⍵:⍵  ( ⌿⍨0>s)(⌿⍨0=s) ⌿⍨0<s ⍺⍺ ?≢}

   ⍝ precedes            ⍝ follows            ⍝ equals
   2 (×-) 8              8 (×-) 2             8 (×-) 8
¯1                    1                    0

   x 2 19 3 8 3 6 9 4 19 7 0 10 15 14

   (×-) Q x
0 2 3 3 4 6 7 8 9 10 14 15 19 19

Q3on muunnos, joka catenates kolme osaa suljettu toiminnan sijasta osien sinänsä . Kussakin rekursiivisessa vaiheessa syntyvät kolme osaa näkyvät lopputuloksen rakenteessa. Kun Q3samasta argumentista johdettu funktio käytetään useita kertoja, saadaan erilaisia ​​tuloksia, koska pivotit valitaan sattumanvaraisesti. Tulosten järjestyksessä läpikäynti tuottaa saman lajiteltu taulukon.

   Q3{1≥≢⍵:⍵  ( ⌿⍨0>s)(⌿⍨0=s)⍪⊂ ⌿⍨0<s ⍺⍺ ?≢}

   (×-) Q3 x
┌────────────────────────────────────────────┬─────┬┐
│┌──────────────┬─┬─────────────────────────┐│19 19││
││┌──────┬───┬─┐│6│┌──────┬─┬──────────────┐││     ││
│││┌┬─┬─┐│3 34││ ││┌┬─┬─┐│9│┌┬──┬────────┐│││     ││
│││││02││    ││ ││││78││ │││10│┌──┬──┬┐││││     ││
│││└┴─┴─┘│    ││ ││└┴─┴─┘│ │││  ││1415││││││     ││
││└──────┴───┴─┘│ ││       │││  │└──┴──┴┘││││     ││
││               ││       │└┴──┴────────┘│││     ││
││               │└──────┴─┴──────────────┘││     ││
│└──────────────┴─┴─────────────────────────┘│     ││
└────────────────────────────────────────────┴─────┴┘
   (×-) Q3 x
┌───────────────────────────┬─┬─────────────────────────────┐
│┌┬─┬──────────────────────┐│7│┌────────────────────┬─────┬┐│
│││0│┌┬─┬─────────────────┐││ ││┌──────┬──┬────────┐│19 19│││
│││ │││2│┌────────────┬─┬┐│││ │││┌┬─┬─┐│10│┌──┬──┬┐││     │││
│││ │││ ││┌───────┬─┬┐│6│││││ │││││89││  ││1415││││     │││
│││ │││ │││┌┬───┬┐│4│││ │││││ │││└┴─┴─┘│  │└──┴──┴┘││     │││
│││ │││ │││││3 3│││ │││ │││││ ││└──────┴──┴────────┘│     │││
│││ │││ │││└┴───┴┘│ │││ │││││ │└────────────────────┴─────┴┘│
│││ │││ ││└───────┴─┴┘│ │││││                              
│││ │││ │└────────────┴─┴┘│││                              
│││ │└┴─┴─────────────────┘││                              
│└┴─┴──────────────────────┘│                              
└───────────────────────────┴─┴─────────────────────────────┘

Yllä oleva muotoilu ei ole uusi; katso esimerkiksi kuva 3.7 klassisesta Tietokonealgoritmien suunnittelu ja analyysi . Kuitenkin toisin kuin pidin ALGOL -ohjelma kuvassa 3.7, Qon suoritettava ja lajittelussa käytetty ositilaus on operandi, yllä olevat esimerkit. (×-)

Dfns operaattoreiden ja junien kanssa

Dfns, erityisesti anonyymi dfns, toimivat hyvin operaattoreiden ja junien kanssa. Seuraava katkelma ratkaisee "Ohjelmointihelmet" -tehtävän: kun löydät englanninkielisen sanakirjan, joka on tässä merkkimatriisina a, etsi kaikki anagrammit.

   a            {[]}1 a        ({[]}1 {} ) a
pats         apst                ┌────┬────┬────┐
spat         apst                patsteasstar
teas         aest                spatsate    
sate         aest                tapsetas    
taps         apst                pastseat    
etas         aest                    eats    
past         apst                    tase    
seat         aest                    east    
eats         aest                    seta    
tase         aest                └────┴────┴────┘
star         arst
east         aest
seta         aest

Algoritmi toimii lajittelemalla rivit erikseen ( ), ja nämä Lajiteltujen rivien käytetään avaimet ( "allekirjoitus" in Ohjelmointi Pearls kuvaus) on keskeinen operaattori ryhmitellä matriisin rivit. Oikealla oleva ilmaisu on juna , syntaktinen muoto, jota APL käyttää hiljaisen ohjelmoinnin saavuttamiseen . Tässä se on eristetty kolmen funktion sarja siten, että ⇔ , josta oikealla oleva lauseke vastaa . {[]}1 a(f g h) (f ) g (h )({[]}1 a) {} a

Lexical soveltamisala

Kun sisempi (sisäkkäisiä) dfn viittaa nimen, se haetaan etsii ulospäin läpi sulkee dfns pikemminkin kuin pitkin kutsupino . Tämän järjestelmän sanotaan käyttävän leksistä laajuutta APL: n tavanomaisen dynaamisen laajuuden sijasta . Ero tulee ilmeiseksi vain, jos kutsutaan toiminto, joka on määritetty ulkoisella tasolla. Tavallisempia sisäpuheluita varten kaksi järjestelmää ovat erottamattomia.

Esimerkiksi seuraavassa funktiossa whichmuuttuja tymääritellään sekä whichitsessään että sisäisessä funktiossa f1. Kun f1soitetaan ulospäin f2ja f2viitataan siihen ty, se löytää ulkoisen (arvolla 'lexical') sen sijaan, että se määritellään f1(arvolla 'dynamic'):

which{
  ty'lexical'
  f1{ty'dynamic'  f2 }
  f2{ty,}
  f1 
}

   which ' scope'
lexical scope

Virhesuoja

Seuraava toiminto havainnollistaa virhesuojainten käyttöä:

plus{
  tx'catch all'   0::tx
  tx'domain'     11::tx
  tx'length'      5::tx
  +
}      
   2 plus 3              ⍝ no errors
5
   2 3 4 5 plus 'three'  ⍝ argument lengths don't match
length
   2 3 4 5 plus 'four'   ⍝ can't add characters
domain
   2 3 plus 3 45        ⍝ can't add vector to matrix
catch all

APL: ssä virhe numero 5 on "pituusvirhe"; virhe numero 11 on "verkkotunnusvirhe"; ja virheen numero 0 on "saalis kaikki" virheille 1-999.

Esimerkki osoittaa paikallisen ympäristön purkautumisen ennen virhesuojaimen lausekkeen arviointia. Paikallinen nimi txon määritetty kuvaamaan sen seuraavan virhesuojauksen tehtävää. Kun tapahtuu virhe, ympäristö puretaan niin, että se paljastaa txstaattisesti oikean arvon.

Dfns versus tradfns

Koska suorat funktiot ovat dfns, perinteisellä tavalla määriteltyjä APL -toimintoja kutsutaan tradfnsiksi, lausutuksi "trad funs". Tässä dfns: ää ja tradfnsia verrataan funktion perusteella sieve: Vasemmalla on dfn (kuten edellä on määritelty ); keskellä on tradfn käyttäen valvonta rakenteita ; Oikealla on tradfn käyttäen GOTOt ( ) ja linja etiketit .

sieve←{
  4≥⍵:⍵⍴0 0 1 1
  r←⌊0.5*⍨n←⍵
  p←2 3 5 7 11 13 17 19 23 29 31 37 41 43
  p←(1+(n≤×⍀p)⍳1)↑p
  b← 0@1 ⊃ {(m⍴⍵)>m⍴⍺↑1 ⊣ m←n⌊⍺×≢⍵}⌿ ⊖1,p
  {r<q←b⍳1:b⊣b[⍵]←1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ ∇ ⍵,q}p
}

∇ b←sieve1 n;i;m;p;q;r
  :If 4≥n ⋄ b←n⍴0 0 1 1 ⋄ :Return ⋄ :EndIf
  r←⌊0.5*⍨n
  p←2 3 5 7 11 13 17 19 23 29 31 37 41 43
  p←(1+(n≤×⍀p)⍳1)↑p
  b←1
  :For q :In p ⋄ b←(m⍴b)>m⍴q↑1 ⊣ m←n⌊q×≢b ⋄ :EndFor
  b[1]←0
  :While r≥q←b⍳1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ p⍪←q ⋄ :EndWhile
  b[p]←1
∇

∇ b←sieve2 n;i;m;p;q;r
  →L10 ⍴⍨ 4<n ⋄ b←n⍴0 0 1 1 ⋄ →0
 L10:
  r←⌊0.5*⍨n
  p←2 3 5 7 11 13 17 19 23 29 31 37 41 43
  p←(1+(n≤×\p)⍳1)↑p
  i←0 ⋄ b←1
 L20:
  b←(m⍴b)>m⍴p[i]↑1 ⊣ m←n⌊p[i]×≢b
  →L20 ⍴⍨ (≢p)>i←1+i
  b[1]←0
 L30:
  →L40 ⍴⍨ r<q←b⍳1 ⋄ b[q,q×⍸b↑⍨⌈n÷q]←0 ⋄ p⍪←q ⋄ →L30
 L40:
  b[p]←1
∇
  • Dfn voi olla anonyymi ; tradfn on nimettävä.
  • Dfn nimetään tehtävän ( ) avulla; tradfn nimetään upottamalla nimi funktion esitykseen ja soveltamalla ⎕fx(järjestelmän funktiota) kyseiseen esitykseen.
  • Dfn on operandina kätevämpi kuin tradfn (katso edelliset kohdat: tradfn on nimettävä; tradfn nimetään upottamalla ...).
  • Nimet annetaan joka dfn ovat paikallista oletusarvoisesti; Tradfn: ssä määritetyt nimet ovat yleisiä, ellei paikallisten luettelossa ole mainittu.
  • Dfn: n paikallisilla on leksuaalinen laajuus ; paikalliset joka tradfn on dynaaminen laajuus , näkyy kutsutaan toimintoja ellei varjostama mukaan niiden paikallisten lista.
  • Dfn: n argumentit on nimetty ja dopin operandit on nimetty ⍺⍺ja ⍵⍵; tradfn: n argumentteilla ja operandeilla voi olla mikä tahansa nimi, joka on määritetty sen eturivillä.
  • Dfn: n tulos (jos sellainen on) on nimetön; tradfn: n tulos (jos sellainen on) nimetään sen otsikossa.
  • Oletusarvo ⍺: lle on määritetty siistimmin kuin tradfn: n vasen argumentti.
  • Rekursio on dfn suoritetaan kutsuvan tai ∇∇tai sen nimi; rekursio Tradfn: ssä suoritetaan vetoamalla sen nimeen.
  • Virtauksen ohjaus dfn: ssä suoritetaan vartijoilla ja toimintokutsuilla; että tradfn: ssä on valvontarakenteita ja (goto) - ja rivitarroja .
  • Lausekkeen arvioiminen dfn: ssä, joka ei pääty tehtävään, palauttaa dfn: n; rivin arviointi tradfnissa, joka ei pääty tehtävään tai gotoon, näyttää rivin tuloksen.
  • Dfn palaa arvioidessaan lauseketta, joka ei pääty tehtävään, arvioidessaan suojattua lauseketta tai viimeisen lausekkeen jälkeen; tradfn palaa (goto) riville 0 tai olemattomalle riville tai ohjausrakenteen arvioinnissa tai viimeisen rivin jälkeen.:Return
  • Yksinkertaisempi virtauksen ohjaus dfn: ssä helpottaa hännän rekursion havaitsemista ja toteuttamista kuin tradfn: ssä.
  • Dfn voi kutsua tradfn: n ja päinvastoin ; dfn voidaan määrittää tradfn: ssä ja päinvastoin .

Historia

Kenneth E. Iverson , APL: n keksijä, oli tyytymätön tapaan, jolla käyttäjäfunktiot (tradfns) määriteltiin. Vuonna 1974 hän kehitti "muodollisen funktion määritelmän" tai "suoran määritelmän" käytettäväksi näyttelyssä. Suorassa määritelmässä on kaksi tai neljä osaa, jotka on erotettu kaksoispisteillä:

name : expression
name : expression0 : proposition : expression1

Suorassa määritelmässä tarkoittaa vasenta argumenttia ja oikeaa argumenttia. Ensinnäkin tulos expressionon funktion tulos; toisessa tapauksessa funktion tulos on, expression0jos se propositionarvioi arvoksi 0 tai expression1jos se arvioi arvoksi 1. Suoran määritelmän sisältämät tehtävät ovat dynaamisesti paikallisia . Esimerkkejä suoran määrittelyn käytöstä löytyy vuoden 1979 Turing Award -luennosta sekä kirjoista ja hakemusasiakirjoista.

Suora määrittely oli liian rajoitettua käytettäväksi suuremmissa järjestelmissä. Useat tekijät kehittelivät ideoita edelleen useissa teoksissa, mutta tulokset olivat hankalia. Näistä Bundan "vaihtoehtoinen APL -funktion määritelmä" vuonna 1987 oli lähimpänä nykyisiä tiloja, mutta siinä on puutteita ristiriidoissa olemassa olevien symbolien kanssa ja virheiden käsittelyssä, mikä olisi aiheuttanut käytännön vaikeuksia, eikä sitä koskaan toteutettu. Eri ehdotusten tärkeimmät tisleet olivat, että (a) määritettävä toiminto on anonyymi, ja myöhemmin nimetyt (tarvittaessa) suoritetaan toimeksiannolla; b) toiminto on merkitty symbolilla ja mahdollistaa siten anonyymin rekursion .

Vuonna 1996 John Scholes Dyalog Limitedistä keksi suoria toimintoja (dfns). Ideat syntyivät vuonna 1989, kun hän luki The Computer Journalin erikoisnumeron toiminnallisesta ohjelmoinnista. Sitten hän opiskeli toiminnallista ohjelmointia ja tuli voimakkaasti motivoituneeksi ("sairas halusta", kuten Yeats ) tuomaan nämä ideat APL: ään. Hän toimi aluksi salaa, koska hän oli huolissaan siitä, että muutokset saatettiin pitää liian radikaaleina ja tarpeettomina kielen monimutkaisina. muut tarkkailijat sanovat, että hän toimi salaa, koska Dyalogin kollegat eivät olleet niin ihastuneita ja luulivat hänen tuhlaavan aikansa ja aiheuttavan ongelmia ihmisille. Dfns esiteltiin ensimmäisen kerran Dyalog Vendor Forumissa APL '96 -konferenssissa ja julkaistiin Dyalog APL: ssä vuoden 1997 alussa. Hyväksyminen ja tunnustaminen tulivat hitaasti. Vielä vuonna 2008 Dyalogissa 25 , julkaisussa, joka juhlii Dyalog Limitedin 25 -vuotisjuhlaa, dfns: t mainittiin tuskin (mainittiin kahdesti "dynaamisina toimintoina" ja ilman tarkennuksia). Vuodesta 2019 lähtien dfns on otettu käyttöön Dyalog APL-, NARS2000- ja ngn/apl -sovelluksissa. Niillä on myös keskeinen rooli pyrkimyksissä hyödyntää grafiikkaprosessorin (GPU) laskentataitoja .

Viitteet

Ulkoiset linkit