Raku (entinen Perl 6) | |
---|---|
Kieliluokka | Moniparadigma |
Esiintyi | Kehitystä on tehty vuodesta 2000 lähtien. Ensimmäinen julkaisu tapahtui 25. joulukuuta 2015 |
Tekijä | Larry Wall |
Kehittäjä | Larry Wall ja Audrey Tan |
Tiedostotunniste _ | .raku, .rakumod, .rakudoc, .rakutesttai.t |
Vapauta | 6.d (24. helmikuuta 2020 ) |
Tyyppijärjestelmä | dynaaminen, staattinen |
Vaikutettu |
haskell , JavaScript , Perl , Ruby , Smalltalk , J |
vaikutti | Perl , Haskell , AntLang |
Lisenssi | GNU General Public License , Artistic License |
Verkkosivusto | raku.org |
OS | cross-platform |
Raku ( japanista 楽土, pron. rakudo - Paradise , [1] [2] ja 楽, pron. raku - onnellisuus, helppous, sukha [3] [4] ) on ohjelmointikieli Perlin kaltaisten kielten perheestä . Perl-kielen suunnittelun ja toteutuksen perusteellinen uudistus, joka katkaisi yhteensopivuuden sen kanssa, vaikka yhteensopivuustilan pitikin olla olemassa vuoteen 2010 asti. [5]
Kuten Perl-kieli, Raku jättää paljon vapautta ohjelmoijille . Sen avulla voit silti ilmaista itseäsi ytimekkäästi, mukaan lukien yhden rivin kirjoittaminen, mutta se myös yksinkertaistaa suurten ohjelmien kirjoittamista staattisen kirjoittamisen ja parannetun OOP -tuen ansiosta .
Rakun entinen nimi oli Perl 6. [6] Perl-yhteisössä on vitsailtu julkaisupäivämäärästä useiden vuosien ajan. Kun kysyttiin "milloin Perl 6 julkaistaan", tavallinen vastaus oli "joululla", mutta ilman vuotta. [7] [8] Vuonna 2015, eli viidentoista vuoden odotuksen jälkeen, niin kutsuttu "joulu" -versio julkistettiin vihdoin. [9] [10] [11]
Perl 6:ssa päätimme, että on parempi korjata kieli kuin korjata käyttäjä.Larry Wall [12]
Larry Wall ilmoitti ensimmäisen kerran Perl 6:n kehityksestä 19. heinäkuuta 2000, saman vuoden Perl-konferenssin neljäntenä päivänä [ 13] State of the Onion -puheessaan . [14] Tuolloin prioriteetit olivat: "historiallisten syylien" poistaminen kielestä; "yksinkertaisten asioiden tulee pysyä yksinkertaisina, monimutkaisista asioista tulee yksinkertaisia ja mahdottomista monimutkaisiksi"; sisäsuunnittelun ja API :n yleinen puhdistus . Prosessi alkoi sarjalla RFC :itä . Tämä prosessi oli avoin kaikille osallistujille, eikä mitään kielen osa-aluetta jätetty muuttamista varten. [viisitoista]
Vastaanotettiin 361 pyyntöä, jotka Wall tarkasti. Sitten hän aloitti useiden "Apokalypsien" kirjoittamisen, kristillisen termin, joka tarkoittaa "hyvien uutisten paljastamista hyville ihmisille". [16] Vaikka alkuperäinen tavoite oli kirjoittaa yksi Apocalypse kutakin en:Programming Perl -kirjan lukua kohti , kävi ilmi, että jokaisen Apocalypsen kirjoittamisen aikana myöhemmät muutokset ohittivat aiemmat Apokalypsit. Tästä syystä julkaistiin sarja synopseja, joista jokainen viittaa yhteen maailmanloppuun, mutta sisältää korjauksia uusista Apokalypseista. Nykyään Raku-spesifikaatiota ohjaa "roast"-testisarja [17] , kun taas synopseja pidetään historiallisena viitteenä. [kahdeksantoista]
Siellä on myös Damian Conwayn kirjoittama Exegesis-sarja, joka selittää jokaisen Apokalypsin sisällön käytännön kannalta. Jokainen eksegeesi koostuu koodiesimerkeistä, joissa käsitellään niiden käyttöä ja merkitystä. [19]
Päätavoitteena, jonka Wall ehdotti alkuperäisessä puheessaan, oli "historiallisten syylien" poistaminen. Näitä olivat sekaannukset taulukoiden ja tiivisteiden merkinnöissä, funktioiden epäselvyydet select, ongelmat paljaiden [20] (ilman välimerkkejä [21] ) tiedostokuvaajien käytössä. Wall mainitsi puheessaan myös monia muita ongelmia, joista Perl-ohjelmoijat ovat keskustelleet vuosia.
Seurauksena näistä tavoitteista oli taaksepäin yhteensopivuuden menetys. Koska ohjelmistoa parannettaessa viitataan yleensä taaksepäin yhteensopivuuteen, Perl 6:n muutokset, jotka rikkovat sen, olisi pitänyt ilmaista selvästi. Vähitellen ero Perl 5:n ja Perl 6:n välillä kasvoi niin suureksi, että Perl 6 nimettiin uudelleen Rakuksi 12. lokakuuta 2019 . [6]
Rakun kehitysvektori on vuosien varrella muuttunut useaan otteeseen. Pythonin ja Rubyn käsitteiden käyttöönotto oli varhainen vaikutus. [22] [23] [24] Lisäksi Pugs, ensimmäinen Raku-tulkki, on kirjoitettu toiminnallisella kielellä Haskell , ja monet toiminnallisen ohjelmoinnin elementit ovat omaksuneet Rakun kehitystiimin. [25] [26]
Kielen maskotti on Camellia-hyönteis. [27] Sen nimi viittaa perlin kielen tunnukseen, kameliin ("Camel"), ja sen muoto, sanapeliä rakastavan Perl-yhteisön perinteen mukaisesti , toistaa sanaa " bug ". Sen perhosmaisiin siipiin kaiverretut spiraalikuviot muistuttavat "P6"-hahmoja, ja poikkeava karsastus on tarkoituksellinen sanapeli "Wall-eyed". [28]
Eloisan ja värikkään logosuunnittelun yksi tavoitteista oli estää naisvihaa yhteisössä ja antaa "maskuliinisia uskomuksia" omaavien näyttää herkän puolensa. [29]
Rakudo on kehittynein toteutus, [30] mikä ei tee siitä kielen virallista versiota, as kieltä ei määrittele toteutus, vaan testipaketti. [31]
Rakudon avulla voit suorittaa [32] -koodia MoarVM-, JVM- ja Node.js - virtuaalikoneissa . [33] MoarVM on virtuaalikone, joka on rakennettu erityisesti Rakudolle ja NQP-kääntäjälle. [34] [35] NQP-kääntäjä (Not Quite Perl 6 ) toteuttaa kielen osajoukon, joka sisältää Raku-säännöt lähdekoodin jäsentämiseen, abstraktin syntaksipuun käsittelyyn ja taustakohtaisen koodin luomiseen . Suuri osa Rakudosta on kirjoitettu rakulla ja NQP:llä. Rakudo ei ole itsenäinen kääntäjä, eikä kääntäjää ole tällä hetkellä tarkoitus mainostaa .
Version "2015.02" jälkeen Rakudo lopetti tuen Parrot -virtuaalikoneelle [36] (MoarVM:n edeltäjä), joka perustui virheelliseen oletukseen, että Perl 6 olisi samanlainen kuin Perl 5. [37] [38]
Rakun ensimmäinen toteutus oli Pugs [39] , Haskellilla kirjoitettu tulkki ja kääntäjä . Se oli edistynein toteutus, mutta vain minimaalisia korjauksia on tehty vuodesta 2007 lähtien GHC :n uusien versioiden pysymiseksi ajan tasalla , ja marraskuusta 2014 lähtien Pugsia ei tueta. [40] Elokuussa 2006 Yichun Zhang jakoi Mopsit-testitiedostot osiin ja liitti niihin asianmukaiset Synapsis-kappaleet, [41] [42] ja tammikuussa 2008 nämä testit integroitiin virallisiin kielen testeihin ("paisti"). ”). [43] [44] Helmikuussa 2015 yhteisö julisti kielikokeet eritelmäksi. [45]
Raku ja Perl ovat pohjimmiltaan erilaisia, vaikka tarkoitus oli pitää Raku Perlinä. Suurin osa muutoksista on tarkoitettu normalisoimaan kieltä niin, että se on helpompi ymmärtää sekä aloitteleville että kokeneille ohjelmoijille, ja tehdä "yksinkertaisista asioista helpompaa ja monimutkaisemmasta mahdollista".
Suurin ei-tekninen ero on, että Raku aloitti spesifikaationa. [31] Tämä tarkoittaa, että Raku voidaan ottaa käyttöön tarvittaessa uudelleen, ja myös sitä, että ohjelmoijien ei tarvitse lukea lähdekoodia saadakseen täyden hallinnan sen ominaisuuksiin. Perl-kielen tapauksessa virallinen dokumentaatio kuvaa vain nykyisen tulkin käyttäytymistä. Kaikki dokumentaation ja toteutuksen välillä löydetyt erot voivat johtaa jommankumman muuttamiseen, mikä on Perl-julkaisujen jatkuvan kehittämisen ja parantamisen liikkeellepaneva voima.
Rakussa dynaamista tyyppijärjestelmää on täydennetty staattisilla tyypeillä . [46] Esimerkiksi:
minun Int $i = 0 ; minun rotan $r = 3,142 ; my Str $s = "Hei, maailma" ;Staattiset tyypit ovat kuitenkin valinnaisia, joten ohjelmoijat voivat tehdä useimmat asiat määrittelemättä tyyppejä erikseen.
minun $i = "25" + 10 ; #$i on 35Perlissä aliohjelmilla ei ole muodollisia parametreja , vaikka parametrien lukumäärän ja tyyppien yksinkertainen tarkistus on mahdollista aliohjelman prototyypeillä. [47] Sen sijaan viittauksella välitetyt todelliset parametrit piilotetaan @_aliohjelman rungon taulukkoelementtien taakse.
Todelliset muodolliset parametrit näkyvät Rakussa. [48] Esimerkiksi:
sub do_something ( Str $thing , Int $other ) { ... }Aivan kuten Perlissä, Rakussa parametrit välitetään viittauksella, mutta oletuksena Rakussa ne ovat vakioita , ts. niiden arvoja ei voi muuttaa. Ne voidaan nimenomaisesti ilmoittaa sallimaan alkuperäisen arvon muuttaminen ( is rw) tai kopioina ( is copy), mikä vastaa arvon ohittamista.
Tapoja siirtää parametritRakussa on kolme tapaa siirtää parametreja: sijainti, nimetty ja slurpy .
Paikkaparametrit ovat vain järjestettyä luetteloa, kuten useimmissa ohjelmointikielissä. Jopa ne voidaan välittää mielivaltaisessa järjestyksessä, kunhan heidän nimensä mainitaan. Parametrit, jotka voidaan välittää vain nimellä, on merkitty symbolilla :ennen muodollisen parametrin merkkiä. Parametrien puristaminen on tapa luoda muuttuvia toimintoja Rakussa . Ne on merkitty symbolilla *ennen muodollisen parametrin merkkiä. Slurpy hash kaappaa nimetyt parametrit, joita ei mainita aliohjelman ilmoituksessa, ja slurpy array kaappaa seuraavat todelliset sijaintiparametrit.
Seuraavassa esimerkissä kaikki kolme menetelmää ovat läsnä, mukaan lukien liukas matriisi.
osa jokin funktio ( $a , $b , : $c , : $d , * @e ) { ... } jokin funktio ( 1 , 2 , : d ( 3 ), 4 , 5 , 6 ); # $a=1, $b=2, $d=3, @e=(4,5,6)Paikkaparametrit vaaditaan oletusarvoisesti, ellei parametrin nimen perässä ole kysymysmerkki. Nimetyt oletusparametrit puolestaan ovat valinnaisia, ellei nimen perässä ole huutomerkki. Squishy-parametrit ovat aina valinnaisia.
Lohkot ja sulkimetParametreja voidaan myös välittää mille tahansa koodilohkolle, joka käyttäytyy kuin sulkeminen . Erityisesti esimerkiksi syklien rungot forovat whilesulkuja. Seuraavassa esimerkissä silmukka ottaa luettelosta kolme elementtiä kerrallaan ja välittää ne lohkoon muuttujina $a, $bja $c. [49]
@list - > $a , $b , $c { ... }Tätä kutsutaan "pointy sub" tai "pointy block", ja siinä oleva nuoli käyttäytyy jossain määrin kuin avainsana sub, joka tuo nimettömän sulkemisen (tai Perlin terminologiassa anonyymin aliohjelman). [48]
Perlissä sigilit (välimerkit, jotka näkyvät ennen muuttujien nimiä) muuttuvat riippuen siitä, kuinka muuttujaa käytetään .
# Perl-koodi my @ array = ('a', 'b', 'c'); minun $elementti = $ array[1]; # palauttaa 'b', my @extract = @array [ 1, 2]; # palauttaa ('b', 'c') minun $elementti = @array [1]; # palauttaa "b" varoituksella (5.10 alkaen)Rakussa tunnukset ovat muuttumattomia: sekä taulukolla että taulukon elementillä on sama merkki. [46]
# Raku-koodi my @ array = 'a', 'b', 'c'; minun $elementti = @array [1]; # $elementti on kirjoitettu "b" my @extract = @array [ 1]; # @ote on kirjoitettu ('b') my @extract = @array [ 1, 2]; # @ote kirjoitetaan ('b', 'c')Perlin merkkien vaihtelu on saanut vaikutteita englannin ja monien muiden luonnollisten kielten numerokäytännöistä .
" Se on omena." #$a on totta " Nämä omenat." # @totuus " Tämä on kolmas omena." # $a[3] on totta " Nämä ovat kolmas omena." # @a[3] ei ole oikeinTämä käsite kuitenkin rikkoutuu, kun viittaukset tulevat peliin, koska ne voivat viitata tietorakenteisiin samalla kun ne ovat skalaareja. Siten sisäkkäisten tietorakenteiden käyttäminen voi edellyttää, että sekä yksikkö että monikko ilmaistaan samalla termillä:
# Perl-koodi: taulukon saaminen hash-elementistä. # Tämä tiiviste tallentaa taulukoita sisältävät tiivisteet. my @trans_verbs = @ { $sanakirja { 'verbi' }{ 'transitiivinen' } };Tällaisilla rakenteilla ei ole analogeja yleisissä luonnollisissa kielissä, mikä aiheuttaa suurta kognitiivista kuormitusta koodia kirjoitettaessa. Sama Raku-koodi:
# Raku-koodi: taulukon saaminen hash-elementistä. # Tämä tiiviste tallentaa taulukoita sisältävät tiivisteet. my @trans_verbs = %sanakirja<verb><transitive><> ;Perl-kielessä olio-ohjelmointia tuetaan funktiolla , joka muuttaa minkä tahansa muuttujan tietyn luokan objektiksi, josta luokassa ilmoitetut menetelmätbless tulevat saataville kutsuttavaksi . [viisikymmentä]
Vaikka tämä mekanismi on erittäin tehokas, se tekee samalla vaikeaksi kuvata jopa alkeellisinta OOP:ta - yksinkertaisia rakennemaisia objekteja niihin liittyvine toimenpiteineen. Lisäksi, koska Perl ei tee oletuksia objektimallista, kääntäjä ei voi optimoida metodikutsuja.
Raku säilyttää matalan tason menetelmän bless, mutta tarjoaa myös rajoittavamman objektimallin yleisiin käyttötapauksiin. [51] [52] Esimerkiksi luokka, joka kapseloi pisteen suorakulmaisessa koordinaatistossa, voidaan määritellä seuraavasti:
luokka Piste on rw { on $.x ; on $.y ; menetelmän etäisyys ( Piste $p ) { sqrt (( $!x - $p . x ) ** 2 + ( $!y - $p . y ) ** 2 ) } menetelmä etäisyys keskustasta { itse . etäisyys: Piste . uusi ( x => 0 , y => 0 ) } } minun $pisteni = Piste . uusi ( x => 1,2 , y => -3,7 ); sano "Pistepaikka: (" , $piste . x , ', ' , $piste . y , ')' ; # Pisteen sijainti: (1,2, -3,7) # Muuta x ja y (käyttäen "x" ja "y" menetelmiä): $point . x = 3 ; $piste . y = 4 ; sano "Pistepaikka: (" , $piste . x , ', ' , $piste . y , ')' ; # Pistepaikka: (3, 4) minun $toinen piste = Piste . uusi ( x => - 5 , y => 10 ); $piste . etäisyys ( $toinen-piste ); #=> 10 $ pistettä . etäisyys keskustasta ; #=> 5Perlissä menetelmiä kutsutaan nuolella: $object->method(). Raku käyttää pistettä nuolen sijaan kuten monet muut kielet (kuten Java ja Python).
Raku-terminologiassa sitä $.xkutsutaan attribuutiksi. Attribuutin saamiseen käytettyä menetelmää kutsutaan accessoriksi [53] ( englannin kielestä access - access). Se luodaan automaattisesti (kun attribuutti ilmoitetaan pisteellä [54] ) ja sen nimi on sama kuin attribuutilla. Se toimii kuten getteri ja kun luokka tai attribuutti is rwsaa asettajan ominaisuudet ja sitä voidaan käyttää tehtävän vasemmalla puolella. Automaattisten liitäntöjen sijaan ohjelmoija voi määritellä omia mukautettuja menetelmiään. Myös luokan rungossa kaikki attribuutit, riippumatta siitä, miten ne on ilmoitettu, voidaan käyttää suoraan käyttämällä $!.
Periytys, roolit ja luokatPeriytys on tekniikka, jossa objektit tai tyypit käyttävät uudelleen logiikkaa tai määritelmiä muista objekteista tai tyypeistä. Ohjelmoija voi esimerkiksi tehdä vakiotyypin valinnaisella attribuutilla. Kielessä, kuten Java, periytyvät luokat, jotka voivat olla muiden olemassa olevien luokkien alaluokkia.
Raku tarjoaa myös perintöä luokkien kautta, kuten muiden ohjelmointikielien luokkia, sekä roolien kautta.
Rakun roolit ovat Javassa käyttöliittymiä , Rubyssa mixinejä , PHP : ssä ominaisuuksia [55] ja Squeakia ( Smalltalk-kielen murre ). Ne ovat samankaltaisia kuin luokat, mutta tarjoavat turvallisemman kokoonpanomekanismin kuin perintö, joka estää attribuuttien ja metodien nimien ristiriidat. [56] [57] Rooleja ei ole rakennettu perintöketjuun. Roolit viittaavat nimellistyyppiseen järjestelmään (katso en:Nominal type system ), eivät rakenteelliseen tyyppijärjestelmään, jota käytetään esimerkiksi Go :ssa . Ne tarjoavat semanttisia nimiä käyttäytymis- ja tilajoukoille. Olennainen ero roolien ja luokkien välillä on se, että roolit eivät instantoi objekteja. [58]
Vaikka roolit eroavat luokista, on mahdollista kirjoittaa koodia, joka luo roolista objektin. Kun yritetään käyttää roolia objektin luomiseen, luodaan samanniminen luokka. Raku-dokumentaatio kutsuu tätä mekanismia automaattiseksi roolipukuksi. luotu luokka on sanapeli. [59]
Pohjimmiltaan roolit ovat nippuja attribuutteja ja mahdollisesti abstrakteja menetelmiä, jotka voidaan lisätä luokkaan ilman periytymistä. Rooli voidaan lisätä jopa yhteen objektiin. Jälkimmäisessä tapauksessa Raku luo anonyymin alaluokan, lisää siihen roolin ja korvaa objektin luokan tällä anonyymillä alaluokalla.
Esimerkiksi koira on nisäkäs , koska koirat perivät nisäkkäiltä tiettyjä ominaisuuksia, kuten maitorauhaset ja selkärankaisten esi -isiensä kautta selkärangan . Toisaalta koirilla voi olla erilaisia käyttäytymistyyppejä, jotka voivat muuttua ajan myötä. Esimerkiksi koira voi olla kotimainen, kulkukoira, olla opas . Nämä lisäkäyttäytymisjoukot voidaan lisätä koiraan. Voit kuvata niitä siten, että voit soveltaa niitä muihin eläimiin. Esimerkiksi kissa voi olla kotimainen ja kulkuväylä. Koira ja kissa eroavat toisistaan, mutta pysyvät yleisessä nisäkkäiden kategoriassa. Joten, Млекопитающее on luokka Собакаja Кошка ovat nisäkkäältä perittyjä luokkia. Mutta yllä olevat käytökset ovat rooleja, jotka voidaan lisätä luokkiin tai luokista luotuihin objekteihin.
luokka Nisäkäs on selkärankainen { ... } luokan koira on nisäkäs { ... } rooli lemmikki { ... } rooli koditon { ... } rooliopas { _ ... }Rooleja lisätään luokkiin ja objekteihin käyttämällä does. Perinnössä käytetään avainsanaa is. Nämä sanat kuvastavat eroa näiden kielen ominaisuuksien merkityksessä: roolin liittäminen antaa luokalle roolin käyttäytymisen , mutta ei tarkoita, että luokasta tulee kirjaimellisesti sama kuin tämä rooli.
luokan opaskoira on opaskoira tekee opaskoiraa { ... } # Alaluokka liittää roolin. minun $koira = Koira . uusi (); $dog tekee opaskoiran ; # Objekti liittää roolin.Sekä roolit että luokat ovat tyyppejä. Roolia voidaan käyttää muuttujan määrittelyssä. Rooli Незрячийvoi esimerkiksi sisältää tyypin attribuutin Поводырь, joka voi olla opaskoira, opashevonen, opashenkilö tai jopa opasauto.
luokka Ihmisellä { on koira $koira ; # Voi sisältää minkä tahansa koiran - ... # sillä ei ole väliä onko se opaskoira vai ei. } rooli Sokea { on opas $opas ; # Voi sisältää minkä tahansa esineen, jonka rooli on ... # Opas - riippumatta siitä, onko se koira vai ei. }Säännölliset lausekkeet ja merkkijonojen käsittely ovat aina olleet yksi Perlin määrittävistä ominaisuuksista. [60] Koska Perlin mallit ylittivät säännölliset lausekkeet jossain vaiheessa, [61] Raku-dokumentaatio viittaa niihin yksinkertaisesti säännöllisiksi lausekkeiksi , mikä irrottautuu säännöllisten lausekkeiden muodollisesta määritelmästä.
Raku laajentaa Perlin ominaisuusjoukkoa säännöllisten lausekkeiden ympärille sijoittamalla ne laajempiin puitteisiin jäsentimien rakentamista varten, joita kutsutaan säännöiksi . [62] Säännöt tarjoavat asiayhteyskohtaisia jäsennysominaisuuksia (kuten PEG :n ja ANTLR : n syntaktinen predikaatti ) ja käyttäytyvät kuin sulkevat sanastonsa . [63] Säännöt syötetään avainsanalla , joka on samanlainen kuin aliohjelman määrittely. Anonyymit säännöt voidaan syöttää avainsanalla (tai ) , tai ne voidaan kuvata säännöllisinä lausekkeina Perlissä käyttämällä (match)- tai (korvaa)-operaattoreita. ruleregexrxms
Apocalypse 5 :ssä Larry Wall listaa 20 ongelmaa nykyisessä "regulex-kulttuurissa". Muun muassa Perlin säännölliset lausekkeet olivat "liian kompakteja ja "söpöjä", ne "luottivat liian vähän liian vähän erikoismerkkejä", niillä oli "huono nimettyjen sieppaustuki", "heikko kieliopin tuki" ja "huono kieliintegraatio". . ". [64]
Joitakin Rakun Perl-rakenteita on muutettu ja optimoitu muita syntaktisia lausekkeita varten. Esimerkiksi sulut, joita vaadittiin suoritusmääräyslausekkeissa , ovat nyt valinnaisia. [49]
if is-true () { for @array { ... } }Operaattori ,(pilkku) on nyt luettelon muodostaja, joten luetteloiden ympärillä ei tarvita sulkeita.
@array = 1 , 2 , 3 , 4 ;Raku sallii seuraavat lausekkeet:
if 20 <= $lämpötila <= 25 { sano "Huoneen lämpötila on 20-25 astetta!" }Tämä nähdään peräkkäisinä vertailuina vasemmalta oikealle, jota seuraa yhdistäminen loogisen AND :n kautta .
Raku käyttää laiskan listan arviointitekniikkaa, joka on samanlainen kuin jotkut toiminnalliset kielet, kuten Haskell : [65]
@integers = 0 .. inf ; # kokonaislukua nollasta äärettömäänTämä koodi ei aiheuta virhettä yritettäessä laittaa ääretön lista taulukkoon @integers, eikä se jumiudu yrittäessäsi kasvattaa luetteloa loputtomiin, jos pyydetään rajallinen määrä elementtejä.
Tämä yksinkertaistaa monia yleisiä tehtäviä Rakussa, mukaan lukien I/O-toiminnot, luettelomuunnokset ja parametrien välitys.
gatherOn myös mahdollista luoda laiskoja listoja käyttämällä ja avainsanoja take. Ne ovat samanlaisia kuin Iconin ja Pythonin generaattorit .
minun $neliot = laiska kerätä 0 .. Inf { ota $ _ * $_ ; };Tässä $squareson ääretön luettelo luonnollisten lukujen neliöitä (mukaan lukien nolla), mutta tämän luettelon laiskan luonteen vuoksi elementit arvioidaan vain, kun niitä käytetään. [66]
Raku ottaa käyttöön risteyskäsitteen [67] ( eng. junction - yhteys, leikkaus; rakussa tämä termi liittyy myös konjunktiin ja disjunktioon [65] ). Se on useiden arvojen päällekkäisyys . [65] Yksinkertaisimmassa muodossaan risteys luodaan risteysoperaattoreiden avulla :
# Esimerkki tyypin ylityksestä | ("mikä tahansa"): minun $väri = 'valkoinen' ; ellei $väri eq 'valkoinen' | 'musta' | 'grey' { die "Tällä värillä tulostamista ei tueta.\n" ; } # Esimerkki rististä, kuten & ("kaikki"): my $salasana = 'salainen!123' ; if $salasana ~~ /<:alpha>/ & / <:digit> / & / <:punct> / { sano "Salasanasi on tarpeeksi vahva." ; }Operaattori |ilmaisee arvon, joka on yhtä suuri kuin vasen tai oikea argumentti, operaattori & - sekä vasen että oikea. Näitä arvoja voidaan käyttää koodissa aina, kun yhden arvon oletetaan olevan semanttisesti. Kaikki risteykseen liittyvät toiminnot vaikuttavat samanaikaisesti kaikkiin sen komponentteihin ja tulos yhdistetään tämän risteyksen operaattorin kautta. Kyllä, se ("apple"|"banana") ~ "s"tulee takaisin "apples"|"bananas". Boolen kontekstissa ristit palauttavat kuitenkin vain yhden arvon, tosi tai epätosi: anyse palauttaa tosi, jos vertailu on tosi vähintään yhdelle elementille; allpalauttaa tosi, jos vertailu on tosi kaikille elementeille. [68]
Crossovereita käyttämällä on mahdollista täydentää tyyppijärjestelmää jollain yleisellä ohjelmoinnilla , joka rajoittaa muuttujat typecrossiin.
alijoukko Väri kaikista missä RGB_Color | _ CMYK_Color ; sub get_tint ( Väri $väri , Num $opasiteetti ) { ... }Crossoverit ovat erikoisobjekteja, jotka jakavat koodin suorittamisen mahdollisesti rinnakkaisiin säikeisiin . Ja ne on suunniteltu erityisesti käytettäväksi loogisessa kontekstissa: et voi käyttää niiden sisältöä suoraan muuntamatta niitä merkkijonoksi, mikä erottaa ne esimerkiksi joukoista ja muista kokoelmista. [68]
Matalan tason kielillä makroista on tullut synonyymi tekstin korvaamiselle lähdekoodissa, koska ne liittyvät C-esiprosessoriin . Kuitenkin korkean tason kielissä, kuten Lisp , joka edelsi C :tä, makrot olivat tehokkaampia. [69] Raku käytti hyväkseen tätä Lisp-tyyppistä makrokonseptia. [48] Tämän tyyppisen makron teho perustuu ohjelman käyttämiseen korkean tason tietorakenteena tekstin sijaan ja pääsyyn kielen kaikkiin ominaisuuksiin.
Makromäärittely Rakussa näyttää aliohjelman tai menetelmän määritelmältä. Ja tällainen makro voi toimia sekä lähdekoodin että abstraktin syntaksipuun ja näiden kahden asian yhdistelmän kanssa.
makro hei ( $mitä ) { quasi { sano "Hei { {{{$mitä}}}" }; }Yllä olevassa esimerkissä makroargumentti jäsennetään ennen makron suorittamista, mikä johtaa informatiivisempiin kääntäjän diagnostisiin viesteihin. Koska makrorunko kuitenkin suoritetaan käännösaikana (jokaisessa käyttötapauksessa), voidaan soveltaa monenlaisia optimointitekniikoita . Makrojen avulla on jopa mahdollista tehdä suurin osa joidenkin ohjelmien työstä ennen kuin ne alkavat suorittaa .
Rakussa tunnisteet voivat sisältää myös heittomerkkejä ja yhdysmerkkejä kirjainten, numeroiden ja alaviivojen lisäksi, kunhan niiden perässä on kirjaimia. Kirjaimet sisältävät "vastaavia" (joka on toteutuksesta riippuvaisia) Unicode-merkkejä , jotka on määritelty Rakudossa ja MoarVM:ssä kuin kaikki "L"-luokan Unicode-merkit. [70]
Tavuviivojen käyttöä alaviivojen sijasta kutsutaan " kebabkoteloksi ". [71] [72] [73]
Metaoperaattorit ovat operaattoreita, joita muut operaattorit voivat parametroida, aivan kuten funktiot voivat ottaa muita toimintoja parametreiksi. [74]
Tehtävän meta-operaattoriPerl on perinyt C-kielen operaattorit, kuten +=, *=ja niin edelleen. Raku yleistää ne meta-operaattoriksi. Jokaiselle binäärioperaattorille opvoimme kirjoittaa:
$x op = $y ; # tai $x [op]= $yMitä tarkoittaa:
$x = $x op $y ;Lisäksi tämä toimii myös käyttäjän määrittämillä operaattoreilla.
HyperoperaattoritNe ovat samanlaisia kuin mapPerlin operaattori. Pakota operaattorit käyttämään kaikkia taulukkoarvoja. Voidaan soveltaa sekä binääri- että unaarioperaattoreihin. [75]
Esimerkiksi seuraava koodi luo taulukon, joka sisältää kaikki taulukon elementit @alisättynä yhdellä:
minun @aPlusOne = @a "+" 1 ; # tai @a >>+>> 1Kulmasulkujen suunta vaikuttaa käyttäytymiseen, kun eripituisia taulukoita välitetään parametreina. [75] Nämä "nuolet" osoittavat, mistä operaation tuloksen pituus tulee.
Esimerkki hyperoperaattorin käyttämisestä unaarioperaattorin kanssa:
minun @a = 1 , 2 , - 3 ; minun @b = -<< @a ; # [-1 -2 3]Hyperoperaattorit eivät toimi vain litteille taulukoille, vaan myös sisäkkäisille taulukoille. [76]
Vähennyksen meta-operaattoriReduktiometa-operaattoria voidaan käyttää minkä tahansa infix -operaattorin kanssa, jolloin se muunnetaan luettelon vähennysoperaattoriksi . On kuin operaattoria sovellettaisiin kahteen ensimmäiseen elementtiin, sitten tuloksena olevaan arvoon ja kolmanteen elementtiin ja niin edelleen, kunnes jäljellä on vain yksi arvo. Summa, tulo, maksimi, minimi jne. voivat toimia operaattoriparametrina. Tämä on erittäin tehokas mekanismi, joka esimerkiksi muuntaa operaattorin +listasummaoperaattoriksi, kuten alla olevassa esimerkissä.
sano "kokonaislukujen summa välillä 0 - 99 on: " , [+] ^ 100 ; RistioperaattoriSe käyttäytyy sekä operaattorina että meta-operaattorina. [77]
Ristioperaattori [75] löytää listojen suoran tulon, joka on järjestetty siten, että elementtien numerointi oikeasta operandista on nopeampaa kuin vasemmasta operandista, [77] palauttaen listasarjan:
1 .. 3 X <ab c> X <de f> ; # ((1 ad) (1 ad) (1 af) # (1 bd) (1 be) (1 bf) # (1 cd) (1 ce) (1 cf) # (2 ad) (2 ae) ( 2 af) # (2 bd) (2 be) (2 bf) # (2 cd) (2 ce) (2 cf) # (3 ad) (3 ae) (3 af) # (3 bd) (3 be ) (3 bf) # (3 cd) (3 ce) (3 cf))Meta-operaattori tiivistää sisäiset luettelot käyttämällä parametrioperaattoria: [77]
1 .. 3 X ~ <ab c> X ~ <de f> ; # (1ad 1ae 1af 1bd 1be 1bf 1cd 1ce 1cf # 2ad 2ae 2af 2bd 2be 2bf 2cd 2ce 2cf # 3ad 3ae 3af 3bd 3be 3bf 3cdf3) Zip-operaattoriEnglannista . vetoketju - vetoketju . [78]
Ristioperaattorin tavoin yhdistää listan elementtejä, [75] mutta palauttaa sekvenssin, joka sisältää ensin kunkin luettelon ensimmäiset elementit, sitten kunkin luettelon toiset elementit ja niin edelleen. [79]
<ab c> Z <1 2 3 4> ; # ((a 1) (b 2) (c 3)) 100 , 200 Z + 42 , 23 ; # (142 223) KäänteisoperaattoritMeta-operaattorilla R( eng. reverse ) voit vaihtaa alkuperäisen operaattorin argumentteja.
sano "yksi jaettuna kolmella on yhtä suuri" , 3 R / 1 ; Metaoperaattoreiden sisäkkäisyysTuloksena meta-operaattorin soveltamisesta operaattoriin on toinen operaattori, johon meta-operaattoria voidaan soveltaa uudelleen ja niin edelleen. Syntaksin yksiselitteistämiseksi hakasulkeet ovat sallittuja. [80]
minun @a = 1 , 2 , 3 ; minun @b = 5 , 6 , 7 ; @a >>>>> @b ; # Jäsennysvirhe. @a >>[>]>> @b ; # [False False False] # Tässä hyper-operaattoria >> >> sovelletaan vertailuoperaattoriin. # Cross-meta-operaattori käyttää # meta- osoitusoperaattoria #, joka on parametroitu additiooperaattorilla: @a X [+=] @b ; # (6 12 19 7 13 20 8 14 21) # Cross-meta-operaattorin vuoksi määritys tehtiin # jokaiselle taulukon @a elementille taulukon @b jokaisella elementillä, # mikä vastaa taulukon @a # elementtien summan lisäämistä taulukon jokaiseen elementtiin @b: sano [+] @b ; #18 sano @a ; # [19 20 21]Kuten muutkin modernit kielet, Raku on suunniteltu tukemaan samanaikaisuutta ja asynkronista ohjelmointia.
Raku tarjoaa yksinkertaisen, modulaarisen , korkean tason API :n samanaikaisen koodin kirjoittamiseen riippumatta siitä, kuinka virtuaalikone toteuttaa tämän API:n. Lisäksi jotkin kieliominaisuudet voivat implisiittisesti toimia asynkronisesti. Näiden toimintojen hallittavuuden ja yhteensopivuuden varmistamiseksi käyttäjäkoodin tulisi mahdollisuuksien mukaan välttää matalan tason rajapintojen käyttöä ( säikeet , aikataulut, lukot ). [81]
Lupaukset [82] [83] ovat keskeinen korkean tason mekanismi , jotka ovat laskelmien tuloksia, jotka on saatu ennen niiden varsinaista valmistumista. Niitä voidaan antaa, suorittaa ja rikkoa. Siten niillä on kolme mahdollista tilaa. Tämän mekanismin vahvuus on kyky yhdistää ne ja yhdistää ne ketjuihin:
minun $p1 = Lupaus . uusi (); minun $p2 = $p1 . then ({ sano "Toisen lupauksen tulos." });Täällä thense varmistaa suorituksen $p2vasta :n suorittamisen jälkeen $p1.
Siellä on myös englantia. Tarvikkeet ("varastot") ja eng. Toimittajat ("toimittajat") - mekanismi asynkronisten tietovirtojen luomiseksi , ja se pystyy käsittelemään useiden vastaanottajien jokaisen viestin kerralla samalla tavalla kuin tapahtumakäsittelijät toimivat muilla ohjelmointikielillä . [81] Tätä mekanismia voidaan käyttää tapahtumalähtöiseen ohjelmointiin .
Lopuksi kanavat ( English Channels ) ovat säikeen turvallisia FIFO - jonoja , jotka ovat samanlaisia kuin nimetyt liukuhihnat käyttöjärjestelmissä, mutta toimivat nykyisessä prosessissa. Keskeinen ero Supplyon se, että putkesta lukeminen on jonon purkamista, [81] ts . yksi arvo voidaan lukea vain kerran.
Ohjelma "Hei maailma!" käytetään usein osoittamaan kielen perussyntaksia. Rakussa se näyttää tältä:
sano 'Hei, maailma' ;Vaikka tietysti on enemmän kuin yksi tapa ilmaista se. [84]
Factorial laskenta , määritelty useilla tavoilla:
# Rekursion käyttö "if-else"-konstruktion kanssa. osafakta ( UInt $n --> UInt ) { if $n == 0 { 1 } else { $ n * fakta ( $n-1 ) } } # Rekursion käyttö "if" #:n kanssa lausekkeen muokkaajana. osafakta ( UInt $n --> UInt ) { return 1 if $ n == 0 ; palauttaa $n * tosiasia ( $n-1 ); } # Rekursion käyttö "kun"-konstruktion kanssa. osafakta ( UInt $n --> UInt ) { kun $n == 0 { 1 } oletusarvo { $n * fakta ( $n-1 ) } } # Kolmen operaattorin käyttäminen. osafakta ( UInt $n --> UInt ) { $n == 0 ?? 1 !! $n * tosiasia ( $n-1 ) } # Usean lähetyksen käyttäminen. multi fact ( 0 ) { 1 } moni tosiasia ( UInt $n --> UInt ) { $n * tosiasia ( $n - 1 ) } # Vähennysmeta-operaattorin käyttäminen. osafakta ( UInt $n --> UInt ) { [*] 1 .. $n } # Tekijäoperaattorin määritelmä, # toteutettu pelkistysmeta-operaattorin kautta. sub postfix: <!>( UInt $n --> UInt ) { [*] 1 .. $n } # Käytä "state"-avainsanaa muistiinpanoon. osafakta ( UInt $n --> UInt ) { tila % tunnettu = 0 => 1 ; palauttaa %tunnettu { $n } , jos %tunnettu { $n }: olemassa ; %tunnettu { $n } = $n * tosiasia ( $n-1 ); palauttaa %tunnettu { $n }; }QuickSort on hyvin tunnettu lajittelualgoritmi. Sen toteutus toiminnallisen paradigman avulla voidaan kirjoittaa ytimekkäästi [a] näin:
# Lajiteltu tyhjä lista on tyhjä lista. moni pikalajittelu ([]) { () } # Muussa tapauksessa ota ensimmäinen elementti pivotiksi... moni pikalajittelu ([ $pivot , * @rest ]) { # Jaa elementit luetteloon niistä #, jotka ovat pienempiä kuin pivot ja ne # suuremmat kuin pivot. minun @ennen = @lepot . grep (* ennen $pivot ); my @after = @lepot . grep (* $pivot :n jälkeen ); # Lajittele nämä aliluettelot ja ketjuta tulos. tasainen ( pikalajittelu ( @ennen ), $pivot , pikalajittelu ( @jälkeen )) }Tätä palapeliä käytetään usein esittelemään rekursio tietotekniikassa . Tämä toteutus käyttää monia menetelmiä , joissa on osana . 0
multi sub hanoi ( 0 , $, $, $) { } # Ei levyjä. Ei ole mitään siirrettävää. multi sub hanoi ( $n , $a = 'A' , $b = 'B' , $c = 'C' ) { # $n levyä ja kolme sauvaa: A, B, C. hanoi $n - 1 , $ a , $c , $b ; # Siirrä ($n - 1) asemaa paikasta A paikkaan B sano "Move drive $n from $a to $c." ; # Siirrä viimeinen levy paikasta A paikkaan C. hanoi $n - 1 , $b , $a , $c ; # Siirrä ($n - 1) levyt paikasta B paikkaan C. } hanoi ( 5 ); # Ratkaisu viidelle levylle.Perl | |
---|---|
Ihmiset |
|
Asiat | |
Kehykset |
|
|