Liikkuva Keskiarvo Clojure


Tänä viikonloppuna päätin kokeilla käteni Scalalla ja Clojure I: llä, joka tuntee esineohjattua ohjelmointia, joten Scala oli helppo noutaa kielenä, mutta halusi kokeilla toiminnallista ohjelmointia. Siellä se kovaa. t näyttävät päästäkseni kirjoitustoimintoihin Asiantuntijana toimivana ohjelmoijana, miten aiotte lähestyä ongelmaa. Kuinka luodaan arvojen luettelo ja määritetty summausjakso, miten luotaisiin uusi luettelo yksinkertaisen liukuvan keskiarvon Esimerkiksi Listan arvot 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 ja jakso 4, funktio palauttaa 0 0 , 0 0, 0 0, 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5. Sen jälkeen, kun olet viettänyt päivän, joka multaa sen päälle, paras, jonka voisin keksinä Scalassa, oli tämä. tämä on hirvittävän tehotonta, joten teen jotain pikemminkin jotain. Nyt se olisi helppo tehdä välttämättömässä tyylissä, mutta voin t elämäni elämän selvittää miten ilmaista sitä toiminnallisesti. Kiinnostava ongelma voin ajatella ma ny-ratkaisuja, joiden tehokkuus vaihtelee Kun lisäämään tavaraa toistuvasti, ei todellakaan ole suorituskykyongelma, mutta anna olettaa, että se on myös alun perin nollia, joten etkö halua tuottaa niitä Jos algoritmi tarjoaa ne luonnollisesti, hieno, jos ei, oikaisemme myöhemmin. Kun Scale 2 8 aloitti, seuraavaa tuloksena olisi n-kausi liukuamalla liukuikkuna List-listalla. Vaikka tämä on melko tyylikäs, se ei t on paras mahdollinen suoritus, koska se ei hyödynnä jo laskettuja lisäyksiä Joten, puhumalla niistä, miten voimme saada heidät. Let sen sanomme, että kirjoitamme tämän. Olemme listan kunkin kahden parin summasta Let's try to käytä tätä tulosta laskettaessa 4 elementin liikkuvaa keskiarvoa. Edellä oleva kaava teki seuraavan laskelman. Joten jos otetaan jokainen elementti ja lisätään se toiseen elementtiin, saadaan 4 elementin liukuva keskiarvo. Voimme tehdä niin. Voisimme sitten laskea liukuvan keskiarvon 8 elementtiä ja niin edelleen No, hyvin tunnettua algoritmia laskea asioita, jotka seuraavat tällaista mallia Se on tunnetuin sen käytön laskemisesta numero valtaa Se menee näin. Joten, anna s soveltaa sitä here. ly , tässä on logiikka Kausi 0 ei kelpaa, jakso 1 on yhtä suuri kuin syöttö, jakso 2 on liukuva ikkuna kokoa 2 Jos sitä suurempi, se voi olla tasainen tai outoa. Jos pariton, lisätään jokainen elementti liikkuvaan summaan Esimerkiksi, jos 3, lisätään jokainen elementti seuraavien kahden elementin liikesummaan. Jos lasketaan myös motionSum n 2: lle, lisätään sitten kukin elementti yhdeksi n 2 askeleeksi sen jälkeen. voimme sitten palata ongelmaan ja tehdä tämä. On vähäinen tehottomuus käytön, mutta se s O-kausi, ei Se voidaan tehostaa, kun häntä rekursiivinen toiminto Ja tietenkin määritelmä liukuva I jos se on kauhean suorituskykyinen, mutta Scala 2: ssa on paljon parempi määritelmä. Huomaa, että voimme tehdä tehokas liukumenetelmä luettelossa, mutta voimme tehdä sen Iterabelissä. Sanoimme kaiken tämän, menen ensimmäisellä määritelmällä ja optimoin vain, jos kriittinen reittianalyysi osoitti tämän suurena sopimuksena. miten kävin ongelman Meillä on liukuva keskimääräinen ongelma Liikkuva keskiarvo on listan liikkuva ikkunan summa jaettuna kyseisen ikkunan koolla. Joten yritän saada liukuikkunan, summaamaan kaiken sen, ja sitten jakaa koon mukaan. Seuraava ongelma oli estää jo laskettujen lisäysten toistaminen. Tässä tapauksessa menin pienimpään mahdolliseen lisäykseen, ja yritin selvittää, kuinka laskea suurempia summia, hyödyntäen tällaisia ​​tuloksia. Lopuksi, yritetään ratkaise ongelma, miten kuvititte sen, lisäämällä ja vähentämällä edellisestä tuloksesta Ensimmäisen keskiarvon saaminen on helppoa. Nyt tehdään kaksi listaa Ensinnäkin vähennettävien elementtien luettelo Seuraavaksi lisätään elementtien luettelo. lisää nämä kaksi luetteloa zip: llä Tämä menetelmä tuottaa vain kun pienemmässä listassa on monia elementtejä, mikä estää ongelman vähentämisen olevan suurempi kuin tarpeen. Lopetamme kirjoittamalla tulos kerrallaan. Mikä on vastaus, joka palautetaan. Koko toiminto näyttää tältä. Tiedän, että Clojure on parempi kuin Scala, niin täällä menee Kun kirjoitan tämän toisen Clojure-merkinnän on ehdottoman välttämätöntä, että se ei ole oikein, mitä olet jäljessä ja isn t idiomatic Clojure Ensimmäinen algoritmi, joka tulee mielessäni, toistaa toistuvasti vaaditun määrän elementtejä sekvenssistä, ensimmäinen elementti ja toistuva. Seuraavat tekstit millaisia ​​sekvenssivektoreita tai listoja, laiska tai ei, ja antaa laiskan keskimääräiset sekvenssit ---, jotka voisivat olla hyödyllisiä, jos käytät luetteloa määrittelemätöntä kokoa. Huomaa, että se vie hoitaa pohja tapauksessa implisiittisesti palauttaa nolla, jos ei ole tarpeeksi elementtejä luettelossa kuluttaa. Tämä suorittaa teidän testitietoihin yields. It doesn t antaa 0 ensimmäinen osa elementtejä sekvenssissä, vaikka sitä voitaisiin helposti käsitellä joitakin mikä on keinotekoisesti. Helpoin asia on nähdä kuvio ja pystyä mieleen, että käytettävissä oleva funktio, joka sopii laskuosioon, antaa laiska näkymän sarjan osista, joita voimme sitten kartoittaa. Joku pyysi häntä rekursiivinen versio tail-rekursiota vastaan ​​laiskuus on vähän kompromissi Kun työsi on listan luominen ja sitten tekemällä funktiosi rekursiivinen on yleensä melko yksinkertainen, eikä tämä ole poikkeus --- rakenna luetteloa argumenttina alitoiminnolle Me ll kerätään vektoriin luettelon sijaan, koska muutoin lista luodaan taaksepäin ja se on päinvastoin lopetettava. Loop on tapa tehdä nimettömän sisäisen toiminnon sellainen kuin Scheme s nimeltään let recur on käytettävä Clojure poistaa hännän kutsut conj on yleinen huoli liittyy luonnollisella tavalla kokoelma --- luettelojen alussa ja vektorit loppuun. vastuullinen elokuu 24 09 at 2 58. Olen päättänyt lisätä tähän vanhaan Q, koska aihe nousi uudelleen ja minä f ind on suositeltavaa viitata tähän mukavaan kokoelmaan mahdollisista ratkaisuista lisäämällä omaa otetta, joka on erilainen kuin aikaisemmat Clojure-versiot, kuten A-luvussa on selitetty. Ehkä voimme rakentaa Webin täydellisimpiä arkistoidut toteutusratkaisut - Micha Marczyk Mar 2 10 at 0 20.Here on osittainen pistemäinen yksi rivi Haskell ratkaisu. Ensin se pätee hännät luettelossa saada häntää listoja, joten. Vahvistaa ja pudottaa ensimmäisen p syöttöjä ottaen p kuin 2 here. In case you eivät tunne pistemäisen symbolin, se on toiminnallinen funktionaalinen koostumus, eli se siirtää yhden toiminnon tuotoksen toisen panoksena ja laatii ne yhdeksi funktioksi, gf tarkoittaa, että arvo on f, ja sitten lähdetään tuotokselle g , joten fgx on sama kuin gfx Yleensä sen käyttö johtaa selkeämpiin ohjelmointityyliin. Sen jälkeen kartoitetaan funktion fromIntegral p sum summa p listalle. Joka listan jokaiselle listalle otetaan ensimmäiset p-elementit, summaa ne ja jakaa sitten ne sitten p Sitten me vain kääntää luettelo takaisin taaksepäin. Tämä kaikki näyttää paljon tehottomampaa kuin se on taaksepäin doesn t fyysisesti kääntää järjestyksessä luettelo kunnes lista on arvioitu, se vain asettaa sen päälle pino hyvä ol laiska Haskell jäljet ​​myös ei luota kaikkia näitä erillisiä luetteloita, se vain viittaa alkuperäisen luettelon eri osiin. Se ei ole vielä erinomainen ratkaisu, mutta se on pitkä rivi. Tässä on hieman parempi mutta pidempi ratkaisu, joka käyttää mapAccumia tekemään liukuvaa vähennyslaskua ja lisäystä. Ensimmäinen jaamme listan kahteen osaan p: ssä, niin. Kerrota ensimmäinen bitti. Napsauta toinen bitti alkuperäisellä listalla, joka vain parittaa kohteet kahdesta luettelosta. Alkuperäinen luettelo on tietenkin pidempi, mutta menetämme tämän ylimääräisen bittin. Nyt määritellään toiminto kartoituksessammeAccum ulator mapAccumL on sama kuin kartta, mutta ylimääräisellä käynnissä olevan tilakapasparametrin avulla, joka siirretään edellisestä kartoituksesta seuraavaan, kun kartta kulkee luettelon kautta Käytämme akkua liikkuvana keskiarvona , ja koska luettelomme on muodostunut elementistä, joka on juuri jättänyt liukuikkunan ja elementin, joka juuri syöttää sen listan, jonka olemme vetäneet, liukuva toiminto ottaa ensimmäisen numeron x pois keskiarvosta ja lisää toisen luvun y siirrä uudet s pitkin ja palaa s jakamalla p snd toinen ottaa vain toisen jäsenen parinumeron, jota käytetään ottamaan toinen palautusarvo mapAccumL, koska mapAccumL palauttaa akun sekä kartoitettu luettelo. että et ole perehtynyt symboliin se on sovellus operaattori Se doesn t todella tehdä mitään, mutta se on a, on pieni, oikea-associative sidonta etusija, joten se tarkoittaa, että voit jättää suluissa ottaa huomioon LISPers, iefx on sama kuin f x. Running ma 4 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 saanto 4 75, 5 0, 6 0, 7 25, 8 25, 6 5 molemmille ratkaisuille. Oh, ja sinun täytyy tuoda moduuliluettelo täyttämään molemmat ratkaisut. Daniel Kiitos kirjoittamiskoodi on paljon helpompaa kuin selittää se - olet kuvannut sen gist Two Lists Streams ylläpidetään molemmissa funktioissa ja päästään otetuksi pois jokaisen iteraation aikana. One List Stream toimii pääkokoelmana iteroitavaksi, kun taas toinen List Stream, joka on sama kokoelma, paitsi jos aika on vähentynyt kaksinkertaiseksi, käytetään laskettaessa uutta liikkuvaa keskiarvoa Walter Changin elokuu 24 09 klo 17 19. J-ohjelmointikieli helpottaa ohjelmia, kuten liukuvaa keskiarvoa. vähemmän merkkejä kuin niiden etiketissä, liukuva keskiarvo. Tässä kysymyksessä määritellyt arvot sisältäen nimet arvot ovat yksinkertainen tapa koodata tätä. Voimme kuvata tämän käyttämällä komponenttien etikettejä. Useat esimerkit käyttävät täsmälleen samaa ohjelmaa. Ainoa ero on useampien nimien käyttö toisessa muodossa Tällaiset nimet voivat auttaa lukijoita, jotka eivät tunne J primaries. Let s näyttää hieman enemmän, mitä on käynnissä aliohjelmassa, keskimäärin d arvojen summaus ja merkitsee jakoa kuten klassista merkkiä. Laskujen laskentamäärät tehdään kokonaisuutena, jolloin arvojen summa jaettuna arvojen summalla. Tässä kirjoitetussa liikkuvan keskiarvon laskennan tulos ei sisällä nollat ​​odotetaan alkuperäisessä kysymyksessä. Nämä nollat ​​eivät todennäköisesti ole osa suunniteltua laskutoimitusta. Tässä käytettyä tekniikkaa kutsutaan hiljaiseksi ohjelmaksi. Se on melko sama kuin funktionaalisen ohjelmoinnin pistemäinen tyyli. Vastaus 26 elokuu 10 kello 16 15. Tässä on Clojure teeskentelee olevan toimintakykyisempi kieli Tämä on täysin tail-rekursiivinen, btw, ja sisältää johtavat nollat. Käytän yleensä kokoelma tai luettelo parametrin viime tehdä funktio helpompi curry Mutta Clojure. is niin hankalaa, olen yleensä päätyä tekemään tämä. ja tapauksessa, se doesnt t todella väliä mitä järjestyksessä parametrit go. answered 24 elokuu 09 at 4 56.Hi Jonathan, olen melko uusi tämän toiminnallinen ohjelmointi, voisitko selittää minulle, miten is on tail-rekursiivinen Kiitos James P 24.9.2009 klo 14 38. Rekursiota tapahtuu if-lausekkeessa, jossa jokin vaihtoehdoista perustuu uudelleen. Tämä laskee jokaisen parametrin ensin, ja vasta sitten jatkaa. Vastaus tulee seuraamaan uudelleen tulos on sama tulos, jonka rekursiivinen palauttaa ilman muita laskutoimituksia, tämä on rekursiivinen Daniel C Sobral 24. elokuuta 2009 klo 15.20. Tämä esimerkki käyttää valtiota, koska minulle se on käytännöllinen ratkaisu tässä tapauksessa ja sulkeminen, jotta luodaan ikkunan keskiarvotustoiminto. Se on silti toimiva siinä mielessä, että se käyttää ensiluokkaisia ​​toimintoja, vaikka se ei ole sivuvaikutus vapaaksi. Nämä kaksi mainitsemasi kieltä ovat molemmat JVM: n päällä, hallinnointi tarvittaessa. Vastaus 24 elokuu 09 at 1 55.Tämä ratkaisu on Haskell, joka on minulle tuntematon. vastuullinen 24 elokuu 09 klo 10 23.Olen kuin käyttää ottelu lausuntoa yritin tehdä jotain vastaavaa, mutta couldn t aivan tehdä niin aina James P 24.09. klo klo 14 39. Lyhyt Clojure-versio, jolla on etuna O-listan pituus riippumatta ajastasi. Tämä hyödyttää sitä, että voit laskea numerojoukon summan luomalla sarjan kumulatiivisen summan esim. 1 2 3 4 5 - 0 1 3 6 10 15 ja vähennetään sitten kaksi numeroa, joiden pituus on yhtä suuri kuin ajanjaksonne. Koska osapuoli oli myöhässä ja uusi toimintojen ohjelmointi, tulin tähän ratkaisuun sisäisellä funktiolla. jakaa koko luettelon aikakaudella len etukäteen Sitten luodaan summa alkaa len-first-elementeistä ja luodaan ensimmäiset, virheelliset elementit 0 0, 0 0. Sitten rekursiivisesti supistetaan ensin ja lisätään viimeinen arvo Loppujen lopuksi luetelen koko asiaa. Vastasivat huhtikuu 29 10 klo 19 28.In Haskell pseudokoodi. Nyt yksi on todella abstrakti 4 out. vastattu Jul 23 13 klo 13 45. Avain on hännän funktio, joka kartoittaa luettelon alkuperäisen luettelon kopioiden luettelosta, jossa ominaisuus, että n-osainen tulos puuttuu ensimmäiset n-1 elementit. Sovellamme tuloksen fmap avg take n, eli otamme n-pituisen etuliitteen alaluettelosta ja laskeimme sen avg Jos listan pituus ei ole n, niin emme lasketa keskimäärin, koska se on määrittelemätön. Tässä tapauksessa emme palauta mitään. Jos se on, teemme ja kääritään vain Lopuksi, suoritamme catMaybesin fmap avg take n: n tuloksella, jotta pääsemme eroon ehkä type. vastasin Oct 21 13 at 1 29. Olen yllättynyt ja pettynyt suorituskykyä, mitä minusta tuntui eniten idiomatic Clojure ratkaisut, JamesCunningham s laiska-seq ratkaisuja. Joten tässä yhdistelmä James ratkaisu, jolla on ajatus mukauttaa nopeasti - eksponentiaatiota siirrettäviin summiin. Muokkaa tätä perustuen Mikeran ratkaisuun - on vieläkin nopeampi. julkaistu 22. heinäkuuta klo 13 21 21.Your Vastaus 2017 Stack Exchange, Inc. Klimi-ohjelmointi esimerkin avulla. Tämä on tarkoitus olla käsi ensimmäisessä tarkastelussa Clojure Jos haluat kokeilla esimerkkejä mennessasi, saatat haluta olla jo perustanut työympäristön joten näet esimerkkikoodin tulokset. Clojure-ohjelmat kirjoitetaan lomakkeissa Suluissa olevat lomakkeet ilmaisevat funktiokutsut. tunnus funktiota argumentteilla 1 2 3 ja palauttaa arvon 6, argumenttien summa. Uudet toiminnot voidaan määrittää käyttämällä defn. Here x ja y ovat symboleja, jotka edustavat syöttöargumentteja Funktion kutsutaan jakamaan x: n ja y: n summa 2: llä Huomaa, että lomakkeet ovat aina etuliitteen notaatiossa, jonka funktiota seuraa myöhempi argumentti Nykyinen keskiarvo voidaan kutsua sisään ja palaa 4 Tässä esimerkissä keskimääräinen symboli, jonka arvo on funktio, viittaa yksityiskohtaisiin lomakkeiden selityksiin. Clojure tarjoaa helpon pääsyn JVM: ään. Tämä kutsuu näyttelymenetelmää, jonka tuloksena syntyy uusi Jframe Huomaa täydellinen pysäytys ennen menetelmän puhelu ja täydellinen pysäytys sen jälkeen, kun rakennus on tehty. Toiminnot voidaan siirtää muihin toimintoihin. takaisin 5 7 9 Kartta on funktio, joka ottaa toisen toiminnon ja kutsuu sen seuraavista kokoelmista otetuilla argumentteilla. Meidän tapauksessamme olemme toimittaneet toiminnon ja kaksi kokonaislukuvektoria Tuloksena on luettelo vektoreista vastaanotettujen argumenttien kutsumisesta Tulosten käyttäminen argumentteina muihin toimintoihin on erittäin voimakas Voimme käyttää aiemmin määriteltyä keskimääräistä toimintamme kartan kanssa, kuten so. returns 5 2 7 2 9 2 Näemme täällä, että Clojure tukee suhteita tietotyypeinä, jotka viittaavat täydelliseen luetteloon. Functions voi myös palata muita funktioita. Tällöin addx palauttaa uuden funktion, joka ottaa 1 argumentin ja lisää x: n. Palauttaa funktion, jota voidaan kutsua 1 argumentti ja 5 lisää siihen. returns 6 7 8 9 10 Kutsuimme karttaa tuloksella addx, joka oli funktio, joka ottaa argumentin ja lisää 5 Tämä funktio kutsuttiin listalle toimittamiemme numerot. on lyhyt tavoite luoda nimettömän funktion. Luodaan funktio, joka kutsuu kahdella argumentilla 1 ja 2. Lisätään 5 numeroihin, jotka syötettiin. Siirrettävyys ja toiminnot dynaamisesti kutsutaan ensiluokkaisiksi toiminnoiksi. Toiminnallinen ohjelmointi käsittelee laskennan matemaattisten funktioiden arvioinnissa ja välttää tilan ja muuttuvan datan Välttämättömällä kielellä tyypillisesti luodaan muuttujia ja muutat niiden arvoa säännöllisesti. Clojure-järjestelmässä palautat uusia tuloksia muuttamatta sitä, mikä oli aiemmin. Toiminnot, joilla ei ole sivuvaikutuksia Edit. Function-puoli vaikutukset voivat muuttaa tulojen arvoja, muuttaa globaaleja tietoja tai suorittaa IO. Imperative void moveplayer p, x, y. updates pelaajaobjekti uudella location. Object Oriented class player. again muokkaa olemassa olevaa object. Functional moveplayer oldp x ya täysin uusi pelaaja palautetaan, vanha pelaaja ei vaikuta. Vaiheessa vain tiedät, että p on muuttunut, koska funktio nimi viittaa sitä ja se mig ht on muuttanut muita asioita, kuten joitakin maailman tietoja sekä FP oldp säilyy sinun don? t tarvitse huolehtia siitä, mitä tapahtui se tai maailma - mikään ei voi muuttua ja on selvää, että uusi pelaaja on palautettu seurauksena liikkuvat. Tärkeimmät edut tässä ovat päättely, testability ja concurrency Kieli pakottaa, että ei ole sivuvaikutuksia, joten voit päätellä käyttäytymistä Tulot suoraan karttaa lähtöjä, jotka helpottavat rakentaa ja ajatella testitapauksia Kaksi säikeet voivat toimia samanaikaisesti samalla tietoja, joilla ei ole vaaraa niiden vahingoittumisesta toisilleen, koska tietoja ei muuteta. Kokeile kohteen poistamista luettelosta Pakottava ratkaisu muuttaisi luetteloa paikalleen Toimiva ratkaisu palauttaisi täysin uuden luettelon, jättäen alkuperäisen paikalleen Tämä ääniä pinnalla on tuhlaavaa, mutta kääntäjää on optimoitu hyvin monella tavalla, jotta se olisi erittäin tehokas. Koodi ilman muuttujia jollekin pakolliselle ohjelmoinnille ittle tottunut Täällä on nopea opas muuntaa muuttuvan tyylin koodiksi toiminnalliseksi koodiksi. Yksi haluat kerätä muutoksia Edit. Rearrange tällaisia ​​asioita muotoon, joka ei vaadi muuttujia. alue 1 100 2 luo laiska numerosarjan 1 3 5 7 99 1 on lähtöpaikka, 100 on päätepiste, 2 on askel vähentää puhelua funktiota Ensimmäiseksi se soittaa kahdella argumentilla, kahdella ensimmäisellä numerolla. se toistaa taas edellisen tuloksen ja seuraavan numeron, kunnes kaikki numerot ovat loppuneet Clojureilla on paljon tukea sekvensseille, kokoelmille ja korkean tason toiminnoille. Kun opit niitä, löydätte erittäin ilmeikkäitä tapoja kirjoittaa tällaisia ​​tehtäviä. haluaa iterata, vaan käyttää silmukan uudelleenmuotoista konstruktia. Muokkaa 5: n faktorialusta. Silmukkakohtainen lomake luo sidokset, joita seuraa arvioitavat lausekkeet. Tässä esimerkissä 5 on sidottu i ja 1 on sidottu acc: hen. Jos erityinen muoto sitten testaa onko i yhtä kuin nolla Koska se ei ole yhtä kuin 0, uudelleensyntyminen palauttaa uudet arvot i: iin ja acc ennen ohjauksen palauttamista takaisin silmukan yläosaan, jotta sen lausekkeiden keho voidaan uudelleenarvioida. Pienennetty i dec i palaa i: ksi ja tuote vasta-alk ja i acc i rebound to acc Tämä silmukka rekursiivisesti kutsutaan, kunnes i on 0 acc tallentaa tuloksen kertomaan jokaisen arvon i otti Huomata, että sitova käyttäytyy kuin muuttuja. Yksi uudelleen voi kohdistaa joko silmukka tai funktio määritelmä. edellä esimerkki, factorial funktio voi ottaa joko 1 argumentti n, joka johtaa arviointiin. Or toimittaa 2 argumentteja johtaa arviointiin. recur on tärkeää, koska se rebinds funktio s panos, eikä lisätä rekursiivinen kutsu pinoon Olimme sen sijaan käytettiin factorial dec n acc n meillä olisi samanlaista käyttäytymistä, mutta n suurille arvoille voi aiheuttaa pinon ylivuoto Huomaa myös, että otimme käyttöön kaksi määritelmää faktorialalle, yhdellä argumentilla ja toisella kahdella argumentilla Käyttäjä kutsuu yksi argumenttiversio, joka käännetään kahdelle argumenttimuodolle arviointia varten. Funktion arity on funktion argumenttien määrä. Tietenkin olisimme voineet kirjoittaa vielä yksinkertaisemman määritelmän edelliseen summaan outoa esimerkkiä. Sinun täytyy tallentaa tulos ja käyttää sitä useita kertoja Edit. There on hyödyllinen makro anna, joka sitoo symbolin arvoa paikalliseen käyttöön. Tässä anna muodostaa satunnaisluku välillä 0 ja 0 8 on syntyy 0 2 ja tulos on sidottu symboliin g Väri on rakennettu punaisten vihreiden sinisten g-arvojen kanssa, joka on harmaasävyintensiteetti, joka vaihtelee 0-2: stä. Haluat tehdä useita menetelmän puheluja samassa objektissa Edit. Java kirjastot käyttävät usein tilanteeseen, jossa haluat käyttää paikallista muuttujaa Muista doto Doto on hieno asia, että se palauttaa objektin usean puhelun jälkeen. Valitse pysyviä tilamuuttujia Edit. Clojure tukee monia mutable tyyppejä, mutta on tärkeää tietää ero niiden välillä ja miten ne käyttäytyvät Mukana olevat tyypit ovat refs, agentit, atomeja ja vars. Refs ovat kuin ref-soluja ML: ssä, Scheme-ruutuissa tai muilla kielillä laatikko, jonka avulla voit muuttaa Bu-sisällön t toisin kuin muut kielet, käänne on se, että voit tehdä vain muutoksen tapahtuman sisällä. Näin varmistetaan, että kahdella langalla ei voi olla ristiriitaa, kun päivitetään tai haetaan ref. declares r: n sisällä tallennettuja tiedostoja ref: ksi, jonka alkuperäinen arvo on nil. sets r: stä 5: een transaktiossa. julkaisee r: n arvon, joka on 5 Huomaa, että r on lyhennetty deref r: lle ja toimii kaikkien Clojures mutable - tyyppien kanssa r itse on ref, ei arvo. Agents Edit. Agents muunnetaan toiminnoilla asynkronisesti Lähetät toiminnon asiamiehelle, joka myöhemmin soveltaa tätä toimintoa sen nykyiseen arvoon Se on asynkroninen, koska kutsu lähettää palautusta välittömästi Toiminto on jonossa lankamallissa suoritettavaksi, mikä tarjoaa kätevän pääsyn moniin - tyyppinen. Tässä esimerkissä määritimme agentin alkuarvolla 1 Lähetimme asiamiehen funktion inc, joka kasvattaa argumenttinsa Nyt lähettää jonot, jotka toimivat suoritettavaksi lanka-altaalla odottaa, estää, kunnes kaikki toiminnot h ave päättynyt palauttaa palauttaa agentimme arvon, joka on nyt 2, koska 1 kasvoi. Tasoja muutetaan funktioilla synkronisesti. Soita swapin ja toimitatte toiminnon arvoon atomin arvo ennen swap-paluuta. Huomaa, että swap palauttaa toiminnon tulosta on sovellettu nykyiseen atomiarvoon Refs koordinoidaan, kun taas aineet ja atomit ovat yhteensopimattomia Tämä tarkoittaa sitä, että monisäikeisessä ympäristössä refs-järjestelmiä muutetaan tapahtumalla, joka varmistaa, että vain yksi säie voi muuttaa arvoa aikaa Kun atomeja ja aineita nousee ylös muuttamalla toimintoja sen varmistamiseksi, että muutokset tapahtuvat atomisesti Kaikki heistä ovat turvallisia, he käyttävät vain erilaisia ​​strategioita tämän turvallisuuden takaamiseksi. Varsit ovat kuin muilla kielillä globaaleja muuttujia Juuriin sitoutuminen on alkuperäinen oletusarvo, joka on jaetaan kaikkiin säikeisiin Yhteysrakenne toimii ikään kuin varia on muutettu, mutta se palautetaan automaattisesti edelliseen arvoonsa, kun poistutaan pakollisen const const ruct. Esents Var jotain arvolla 5 Declaring-toiminnot itse asiassa luo ne Varsiksi Vältä välttää def: n käyttöä ja erityisesti välttää asettamasta jo ilmoitettuja sidoksia def: llä Seuraavaksi kutsumalla def something 6 ei ole thread-safe operation. Miksi Clojureilla ei ole paikallisia muuttujia on usein esitelty kysymys Mutaation paikallisesti on yhtä vaikea ymmärtää kuin mutaatio maailmanlaajuisesti, riippumattomuus rinnakkaisuudesta Katso esimerkiksi tyypillinen Java silmukalle, joka asettaa muita paikallisia vars ja sisältää taukoja palaa Jos se vie enemmän ajatuksia aluksi rakentaa ratkaisuja, jotka eivät tarvitse muuttujia, yritä vaivata vaivaa - se maksaa sinulle monta kertaa. Kuitenkin, kun tuetaan suppeiden algoritmien suoraa kääntämistä, on olemassa hyödyllinen makro nimeltä local-vars, joka julistaa paikalliset varat, jotka voidaan muuttaa var-setilla ja lukea var-getilla tai shorthandilla. Tämä on versiota factorial käyttäen muuttujia Koska näet, että se ei ole niin mukavaa kuin versiot aiemmin kuvattu ja on puhtaasti osoittaa paikallisen Var sitominen Tämä funktio on täysin turvallinen kutsua monisäikeisiin ympäristöihin, koska muuttujat ovat paikallisia. Paikallisille muuttujille ei kuitenkaan voida päästää niiden ulottuvuutta. Varat ovat null, ei sitoumuksia. h f palauttaa uuden toiminnon, joka lisää 2 paikalliseen muuttujaan, joka on määritelty f: ssä. Palautettu funktio yrittää pitää yllä f: n paikallista muuttujaa. Nyt paikalliset muuttujat voivat muuttua, mutta jos muutos tapahtuisi monisäikeisessä ympäristössä , ja että muuttuja oli vuotanut alkuperäisen ulottuvuutensa ulkopuolella, muutos ei enää olisi paikallinen. Käännös on termi, jota käytetään, kun symbolit säilytetään määritelmän ulkopuolella. Tässä luotiin kaksi funktiota, jotka molemmat pääsevät ref-salaisuuteen. , niin salaisuus ei ole näkyvissä nykyisessä soveltamisessamme enää. ohjeet Symbolin salaisuutta ei voida ratkaista tässä yhteydessä. Mutta toiminnot ovat itseään säilyttäneet salaisuuden ja voivat käyttää sitä kommunikoimaan. Clojure Liukuva keskiarvo Javaista Clojureen. Clojure on työskennellyt jonojen kanssa En tiedä, miksi sillä ei ole lukukomponenttia, mutta toimii hyvin ja palauttaa sinulle Clojure-kokoelman, jota voit käsitellä haittoja ja peekia. Voit aloittaa tyhjää jonoa tai lisää esineesi konstruktoriin. Olen kirjoittamassa joitain materiaalia portugaliksi, jos sinulla on jotain kiinnostusta. 20.07.2014 klo 08 48 Cecil Westerhof kirjoitti. Mietin vain, mikä on paras tapa kääntää tämä Clojure. Tällä hetkellä Clojure ei ole jonossa Jos käytän vain Java-puheluita tai onko parempi tapa .-- Cecil Westerhof - Sait tämän viestin, koska olet tilannut Google Groupsin Clojure-ryhmälle. tämä ryhmä, lähetä sähköpostia Huomaa, että uusien jäsenten viestit ovat moderoituneita - ole kärsivällinen ensimmäisellä viestillesi. Voit irtisanoa tämän ryhmän lähettämällä sähköpostia osoitteeseen clojure. Jos haluat lisätietoja, vieraile tällä ryhmällä --- Sait tämän viestin, koska olet tilannut Google-ryhmät Clojure grou p Peruota tilaus tästä ryhmästä ja lopeta sähköpostiviestien vastaanottaminen, lähetä sähköpostia osoitteeseen Lisätietoja-vaihtoehdoista, käy .-- Sait tämän viestin, koska olet tilannut Google Groupsin Clojure-ryhmän. Voit lähettää tähän ryhmään lähettämällä sähköpostia osoitteeseen Huomaa, että Uusia jäseniä koskevat viestit ovat moderoituneita - ole kärsivällinen ensimmäisellä viestillesi. Voit irtisanoa tämän ryhmän lähettämällä sähköpostia osoitteeseen clojure. Jos haluat lisätietoja vaihtoehdoista, käy tämän ryhmän osoitteessa --- Sait tämän viestin, koska olet tilannut Google Groups Clojure - ryhmän. poista tilaus tästä ryhmästä ja lopeta sähköpostiviestien vastaanottaminen, lähetä sähköpostia osoitteeseen Lisävalinnat, vierailla. Mike Fikes On tosiaankin jonon toteutus Tässä on tapa käyttää sitä ongelmallasi defn make-moving-average-queue n atomi defn update-moving-average-queue old-queue next-value anna current-total current-total old-queue next-value vanhat arvot conj old-values ​​old-queue next-arvo jos count vanhat arvot old-queue anna current - yhteensä - nykyiset ensimmäiset vanhat vanhat arvot. On todellakin jono toteutus Tässä on tapa käyttää sitä ongelmallesi. defn make-moving-average-queue n atom current-yhteensä 0 0 vanhoja arvoja. defn update-moving-average-queue old-queue next-value anna current-total current-total old-queue next-value vanhat arvot conj old-values ​​old-queue next-value jos count old-values ​​pituus old-queue current-total - current-total ensimmäinen vanhat arvot old-values ​​pop vanhat arvot assoc vanhentuneiden vanhojen arvojen assoc vanhojen vanhojen arvojen assoc vanhojen vanhojen arvojen assoc vanhojen vanhojen arvojen assoc . defn liikkuvaa keskimäärää vanhan jonon seuraavan arvon anna uuden rivin vaihtaa vanhan jonon päivitys-siirto-keskimää - jono seuraavan arvon nykyinen-yhteensä uusi jono laskee vanhat arvot uudelle jonoon. def-jono-06 tekevä keskimääräinen jono 6. def inputs-06 20 22 21 24 24 23 25 26 20 24 26 26 25 27 28 27 29 27 25 24. doseq input inputs-06 println liikkuva keskimääräinen jono-06 tulo. def-jono-10 - mobiili-keskimääräinen jono 10. def inputs -10 20 22 24 25 23 26 28 26 29 27 28 30 27 29 28. annos input inputs-10 println liikkuva keskimääräinen jonon 10 input .-- You sai tämän viestin, koska olet tilannut Google-ryhmien Clojure-ryhmälle Voit lähettää tälle ryhmälle lähetä sähköpostia Huomaa, että uusien jäsenten viestit ovat moderoituneita - ole kärsivällinen ensimmäisellä viestillesi Voit poistaa tilisi tästä ryhmästä, lähettää sähköpostia osoitteeseen clojure - vaihtoehtoja, käy tämän ryhmän osoitteessa --- Sait tämän viestin, koska olet tilannut Google Groupsin Clojure-ryhmälle. Voit peruuttaa tämän ryhmän ja lopettaa sähköpostiviestien vastaanottamisen, lähetä sähköpostia osoitteeseen Lisätietoja-vaihtoehtoja osoitteessa. Miike Fikes Hey Cecil, Sen sijaan, että käytit piikkiä ensimmäisen sijasta, kuten Plinio on osoittanut, ylhäältä liikkuva keskimääräinen funktio käyttää joitakin huonoja nimiä jälkikäteen, etenkin vanhan jonoparametrin nimi I d viittaa siihen, että se nimeää jonon, koska se viittaa atomiin, jota voisit harkitse myös nimitystä liikkuva keskimääräinen toiminto - Sait th on viestin, koska olet tilannut Google-ryhmien Clojure-ryhmälle Voit lähettää tälle ryhmälle lähettämällä sähköpostia suojattuun sähköpostiosoitteeseen Huomaa, että uusien jäsenten viestit ovat 20. heinäkuuta 2014 klo 13.55. kuten Plinio osoittaa, liikkuvat keskimääräinen funktio käyttää joitakin huonoja nimiä jälkikäteen, etenkin vanhan jonoparametrin nimi, jonka I d viittaa siihen, että se nimeää jonon, koska se viittaa atomiin. Voit jopa harkita funktion nimeämistä liukuva keskiarvo. - Sait tämän viestin, koska olet tilannut Google-ryhmien Clojure-ryhmälle Voit lähettää tälle ryhmälle lähettämällä sähköpostia Huomaa, että uusien jäsenten viestit ovat modernija - ole kärsivällinen ensimmäisellä viestillesi. Voit irtisanoa tämän ryhmän, lähettää sähköpostia osoitteeseen clojure Saat lisää vaihtoehtoja käymällä tällä ryhmällä osoitteessa --- Sait tämän viestin, koska olet tilannut Google Groups Clojure - ryhmän. Voit peruuttaa tämän ryhmän ja lopettaa sähköpostiviestien vastaanottamisen, lähetä sähköpostia osoitteeseen Lisätietoja valinnoista. Jony Hudson P mutta eksponentiaalisesti painotettu liikkuva keskiarvo ei vaadi muuta tilaa kuin nykyinen arvo defn ewma alpha fn avg uusi - 1 alpha avg alpha uusi Jony - Sait tämän viestin, koska olet tilannut Google-ryhmät Clojure-ryhmä Voit lähettää tälle ryhmälle lähettämään sähköpostia suojattuun sähköpostiosoitteeseen Huomaa, että uusien jäsenten lähettämät viestit ovat moderoituneita - ole kärsivällinen ensimmäisellä viestillesi. Voit irtisanoa tämän ryhmän lähettämällä. Sunnuntaina 20. heinäkuuta 2014 12 48 19 UTC 1, Cecil Westerhof kirjoitti. Tai on parempi tapa. Ei todennäköisesti vastaus, jota etsit, mutta eksponentiaalipainotettu liikkuva keskiarvo ei vaadi mitään muuta tilaa kuin nykyinen arvo. defn ewma alpha fn avg uusi - 1 alpha avg alpha new .-- Sait tämän viestin, koska olet tilannut Google Groups Clojure - ryhmän. Voit lähettää tälle ryhmälle lähettämällä sähköpostia. Huomaa, että uusien jäsenten viestit ovat moderoituneita - ole kärsivällinen with your first post To unsubscribe from this group, send email to clojure For more options, visit this group at --- You received this message because you are subscribed to the Google Groups Clojure group To unsubscribe from this group and stop receiving emails from it , send an email to For more options, visit.

Comments

Popular Posts