Saturday, 28 October 2017

Moving Gjennomsnittet Clojure


I helgen bestemte jeg meg for å prøve hånden min på noen Scala og Clojure. Jeg var dyktig med objektorientert programmering, og så var Scala lett å plukke opp som språk, men ønsket å prøve funksjonell programmering. Dette er hvor det ble vanskelig. Jeg kan bare Jeg ser ut til å få hodet mitt til en modus for skrivefunksjoner. Som en sakkyndig funksjonell programmerer, hvordan nærmer du deg et problem. Gi en liste over verdier og en definert summasjonsperiode, hvordan vil du generere en ny liste over det enkle glidende gjennomsnittet av listen. For eksempel Gitt listeværdiene 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 og perioden 4, skal funksjonen returnere 0 0 , 0 0, 0 0, 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5. Etter å ha brukt en dag med å mulle det over, var det beste jeg kunne komme opp med i Scala dette. Dette er forferdelig ineffektivt, jeg vil mye heller gjøre noe som. Nå kunne det lett gjøres i en imperativ stil, men jeg kan for livet av meg finne ut hvordan man uttrykker det funksjonelt. Interessant problem jeg kan tenke på ma Ny løsninger, med varierende grad av effektivitet Det er ikke nødvendigvis å legge til ting gjentatte ganger, men det er ikke et ytelsesproblem, men la oss anta at det også er nullene i begynnelsen på forhånd, så la oss ikke bekymre oss om å produsere dem. Hvis algoritmen gir Selvfølgelig, fint, hvis ikke, korrigerer vi det senere. Ved å starte med Scala 2 8, vil følgende gi resultatet for n periode ved å bruke glidende for å få et glidende vindu på listen. Likevel, selv om dette er ganske elegant, gjør det ikke ha den beste ytelsen mulig, fordi det ikke utnytter allerede beregnede tillegg. Så, snakk om dem, hvordan kan vi få dem. Vi sier at vi skriver dette. Vi har en liste over summen av hver to par. La oss prøve å bruk dette resultatet til å beregne det bevegelige gjennomsnittet på 4 elementer Formelen ovenfor gjorde følgende beregning. Så hvis vi tar hvert element og legger det til det andre neste elementet, får vi det bevegelige gjennomsnittet for 4 elementer. Vi kan gjøre det slik. Vi kunne deretter beregne det bevegelige gjennomsnittet for 8 elementer og så videre Vel, det er en velkjent algoritme for å beregne ting som følger slikt mønster. Det er mest kjent for bruk på å beregne kraften til et nummer. Det går slik. Så, la s bruke det her. Så , her er logikken Period 0 ugyldig, periode 1 er lik innspillet, periode 2 er glidende vindu av størrelse 2 Hvis større enn det, kan det være jevnt eller merkelig. Hvis det er merkelig, legger vi hvert element til det bevegelige Sumet av neste merkelig - 1 elementer For eksempel, hvis 3, legger vi hvert element til movingSum av de neste 2 elementene. Hvis vi selv beregner movingSum for n 2, legger vi deretter hvert element til ett n 2 trinn etterpå. Med denne definisjonen, Vi kan da gå tilbake til problemet og gjøre dette. Det er en liten ineffektivitet med hensyn til bruken av, men det er O periode, ikke Det kan gjøres mer effektivt med hale rekursiv funksjon Og selvfølgelig definisjonen av glidende I gitt er fryktelig ytelsesmessig, men det vil bli en mye bedre definisjon av det på Scala 2 8 Merk at vi ikke kan lage en effektiv glidemetode på en liste, men vi kan gjøre det på en Iterable. Having sagt alt det, jeg går med den aller første definisjonen, og optimaliserer bare hvis en kritisk bananalyse fastslår dette som en stor sak. For å konkludere, la oss vurdere hvordan jeg gikk om problemet Vi har et bevegelig gjennomsnittlig problem Et glidende gjennomsnitt er summen av et bevegelig vindu på en liste, delt med størrelsen på vinduet. For det første prøver jeg å få et skyvevindu, summere alt på det, og deretter divideres med størrelsen. Det neste problemet var å unngå gjentagelse av allerede beregnede tillegg. I dette tilfellet gikk jeg til det minste mulige tillegget, og prøvde å finne ut hvordan å beregne større summer, gjenbruk av slike resultater. La oss prøve å løse problemet slik du har funnet det, ved å legge til og trekke fra forrige resultat. Å få det første gjennomsnittet er enkelt. Nå lager vi to lister. Først, listen over elementer som skal trekkes ned. Neste, listen over elementer som skal legges til. Vi kan legg til disse to lister ved hjelp av zip Denne metoden vil bare produsere uce så mange elementer som den mindre listen har, noe som unngår at problemet med å trekke seg er større enn nødvendig. Vi avslutter ved å komponere resultatet med en fold. Hvem er svaret som skal returneres Hele funksjonen ser slik ut. Jeg vet Clojure bedre enn Scala, så her går Når jeg skriver dette, er den andre Clojure-oppføringen her viktig, at det egentlig ikke er hva du reiterer og ikke er idiomatisk Clojure Den første algoritmen som kommer til å tenke meg, tar gjentatte ganger det ønskede antall elementer fra sekvensen, det første elementet og gjentakende. Følgende fungerer på en hvilken som helst sekvensvektor eller liste, lat eller ikke, og gir en lat sekvens av gjennomsnitt --- som kan være nyttig hvis du jobber på en liste med ubestemt størrelse. Merk at det tar bryr seg om basissaken ved å implisitt returnere null hvis det ikke er nok elementer i listen til å forbruke. Kjører dette på testdataene dine. Det gir ikke 0 for de første elementene i sekvensen, men det kan lett håndteres noen hva kunstig. Det enkleste av alt er å se mønsteret og være i stand til å huske på en tilgjengelig funksjon som passer til billedpartisjonen, gir en lat visning av deler av en sekvens som vi deretter kan kartlegge. Noen spurte etter en hale rekursiv versjon halen rekursjon vs latskap er litt av en tradeoff Når jobben din bygger opp en liste, så gjør funksjonen halen rekursiv er vanligvis ganske enkelt, og dette er ikke noe unntak --- bare bygge opp listen som et argument til en subfunction Vi vil akkumulere til en vektor i stedet for en liste fordi ellers vil listen bli bygd opp bakover og må reverseres på slutten. Loop er en måte å lage en anonym indre funksjon som for eksempel Scheme s kalt let recur må brukes i Clojure for å eliminere haleanrop er conj en generalisert ulempe som er naturlig for samlingen --- begynnelsen av lister og slutten av vektorer. ansvaret 24. august 09 på 2 58. Jeg har bestemt meg for å legge til denne gamle Q, fordi emnet kom opp igjen og jeg f Det er foretrukket å peke på denne fine samlingen av mulige løsninger, mens du legger til min egen oppgave som er forskjellig fra tidligere versjoner i Clojure, som forklart i A. Kanskje vi kan bygge nettets mest komplette lagringsplass for funksjonelle mov-avg implementeringer - Micha Marczyk Mar 2 10 på 0 20.Her sa delvis punktfri en linje Haskell løsning. First det gjelder haler til listen for å få haler listene, så. Vendrer den og dropper de første p-postene som tar p som 2 her. I tilfelle du Er det ikke kjent med punktpipepunktet, er det operatøren for funksjonell sammensetning, noe som betyr at den passerer utgangen av en funksjon som inngang til en annen, og komponerer dem i en enkelt funksjon gf betyr løp f på en verdi, og send utgangen til g , så fgx er det samme som gfx Generelt fører bruken til en klarere programmeringsstil. Deretter kartlegger funksjonen fraIntegral p sum ta p på listen Så for hver liste i listen tar det de første p-elementene, summerer dem og deler deretter dem ved siden av vi slår bare listen tilbake igjen med omvendt. Dette ser alt mye mer ineffektivt ut enn det er omvendt, ikke fysisk reverserer rekkefølgen til en liste til listen er evaluert, den bare legger den ut på stabelen, gode og lette Haskell-haler også lager ikke alle de separate lister, det refererer bare til forskjellige deler av den opprinnelige listen. Det er fortsatt ikke en god løsning, men det er en linje lang. Her er litt finere, men lengre løsning som bruker mapAccum til å gjøre en glidende subtraksjon og tillegg. Først vi deler opp listen i to deler på p, så. Som den første biten. Sett den andre biten med den opprinnelige listen, dette parrer bare av elementer i rekkefølge fra de to listene. Den opprinnelige listen er åpenbart lengre, men vi mister denne ekstra biten. Nå definerer vi en funksjon for vårt kartAccum ulator mapAccumL er det samme som kartet, men med en ekstra løpestatus akkumulator parameter som går fra forrige kartlegging til den neste når kartet går gjennom listen Vi bruker akkumulatoren som vårt bevegelige gjennomsnitt , og da vår liste er dannet av det elementet som nettopp har forlatt skyvevinduet og elementet som nettopp har skrevet det inn i listen vi bare har glidet, tar vår glidende funksjon det første tallet x bort fra gjennomsnittet og legger til det andre nummeret y pass den nye s sammen og tilbake s divisjonert med p snd sekund bare tar det andre medlemmet av et par tuple, som brukes til å ta den andre retur verdien av mapAccumL, da mapAccumL vil returnere akkumulatoren så vel som kartlagt listen. For de av deg ikke kjent med symbolet, det er applikasjonsoperatøren. Det gjør det egentlig ikke noe, men det har en lav, høyre-assosiativ bindende forrang, så det betyr at du kan legge ut parentesene. Legg merke til LISPers, iefx er det samme som f x. Running ma 4 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 40, 1 0 gir 4 75, 50, 0, 7 25, 80, 8 25, 6 5 for begge løsninger. Åh, og du må importere modullisten for å kompilere begge løsninger. Daniel Takk Skrivingskoden er mye enklere enn å forklare det. Du har beskrevet det kjennetegnet av det. To lister Streamer opprettholdes i begge funksjonene og får hodet tatt av under hver iterasjon. En liste Stream tjener som hovedsamlingen til å lure gjennom mens den andre Listestrømmen, som er den samme samlingen, med unntak av perioden mindre Dobler tatt av den, brukes til beregning av det nye glidende gjennomsnittet Walter Chang Aug 24 09 på 17 19.J programmeringsspråket gjør det lettere å flytte gjennomsnitt. Faktisk er det færre tegn i enn i etiketten, flytende gjennomsnitt. For verdiene som er angitt i dette spørsmålet, inkludert navnverdiene her, er det en enkel måte å kode dette på. Vi kan beskrive dette ved å bruke etiketter for komponenter. Eksempler bruker nøyaktig samme program Den eneste forskjellen er bruken av flere navn i den andre formen. Slike navn kan hjelpe lesere som ikke vet J-primærene. La oss se nærmere på hva som foregår i delprogrammet, gjennomsnitt d antyder summasjon og betegner divisjon som det klassiske tegnet. Beregning av en tallytelling av elementer er utført av Det overordnede programmet, da er summen av verdier dividert med verdien av verdier. Resultatet av den gjennomsnittlige beregningen som er skrevet her, inneholder ikke ledende nuller forventes i det opprinnelige spørsmålet Disse nullene er uten tvil ikke en del av den tiltenkte beregningen. Teknikken som brukes her kalles stilig programmering. Det er stort sett det samme som den punktfrie stilen for funksjonell programmering. Ansatt 26. august kl. 16 ved 16 15. Her ligner Clojure å være et mer funksjonelt språk. Dette er helt hale-rekursivt, btw, og inneholder ledende nuller. Vanligvis legger jeg inn samlingen eller listeparameteren for å gjøre funksjonen enklere å karriere. Men i Clojure. is er det så tungvint jeg vanligvis ender opp med å gjøre dette. I hvilket tilfelle spiller det egentlig ingen rolle hvilken rekkefølge parametrene går. Ansatte 24. august 09 på 4 56. Han Jonathan, jeg er ganske ny til denne funksjonelle programmeringen, kan du vær så snill å forklare meg hvordan er hale-rekursiv Takk James P Aug 24 09 ved 14 38. Rekursjonen skjer på if-setningen, hvor enten alternativet er basert på gjentatt. Dette vil beregne alle parametere først og bare deretter rekursere Svaret vil være et resultat av gjentatt As Resultatet er det samme resultatet som returneres av rekursjonen, uten andre beregninger, dette er rekursiv hale. Daniel C Sobral Aug 24 09 på 15 20.Dette eksempelet bruker stat, siden det er en pragmatisk løsning i dette tilfellet, og en lukking for å skape windowing-middelfunksjonen. Den er fortsatt funksjonell i den forstand at man bruker førstegangsfunksjoner, selv om den ikke er bivirkningfri. De to språkene du nevnte, kjøres på toppen av JVM og dermed begge tillater statlig - ledelse når det er nødvendig. ansvaret 24. august kl. 01. 55. Denne løsningen er i Haskell, som er mer kjent for meg. Ansatt 24. aug 09 kl. 10. 23.Jeg liker bruken av kampoppstillingen, prøvde jeg å gjøre noe lignende, men kunne ikke helt gjør det hele veien der James P Aug 24 09 på 14 39. En kort Clojure-versjon som har fordelen av å være O-listelengde uavhengig av perioden. Dette utnytter det faktum at du kan beregne summen av en rekke tall ved å opprette en kumulativ sum av sekvensen f. eks 1 2 3 4 5 - 0 1 3 6 10 15 og deretter trekke de to tallene med en forskyvning lik din periode. Etter sent på festen, og ny til funksjonell programmering, kom jeg også til denne løsningen med en indre funksjon. Jeg vedtok ideen om å Del hele listen med perioden i forveien. Da genererer jeg summen som skal begynne med for de første elementene. Og jeg genererer de første, ugyldige elementene 0 0, 0 0. Deretter trekker jeg rekursivt den første og legger til den siste verdien Til slutt lister jeg hele greia. ansvaret 29. april kl. 19 på 19. 28. I Haskell pseudokode. Nå skal man virkelig abstrahere de 4 out. answered 23. juli klokken 13 45. Nøkkelen er halerfunksjonen, som kartlegger en liste på en liste over kopier av den opprinnelige listen, med egenskapen som n-telen av resultatet mangler de første n-1 elementene. Vi bruker fmap avg ta n til resultatet, som betyr at vi tar n-lengde prefiks fra dellisten og beregner dens avg Hvis lengden på listen vi er avg ing ikke er n, da beregner vi ikke gjennomsnittet siden det er udefinert. I så fall returnerer vi ingenting. Hvis det er, gjør vi det og slår det inn. Endelig kjører vi catMaybes på resultatet av fmap avg ta n, for å kvitte seg med kanskje type. answered 21 okt 13 på 1 29.Jeg var overrasket og skuffet over resultatet av det som syntes meg de mest idiomatiske Clojure-løsningene, JamesCunningham s lazy-seq solutions. So her sa kombinasjon av James løsning med s ide om å tilpasse rask - eksponering til flyttende summer. Rediger denne en-basert på mikera s løsning - er enda raskere. svaret 22. juli kl. 13 på 19 21. Din Svar.2017 Stack Exchange, Inc. Clojure Programmering ved eksempel. Dette er ment å være en hånd på første titt på Clojure. Hvis du ønsker å prøve eksemplene mens du går, kan du kanskje allerede ha satt opp et arbeidsmiljø som per slik at du kan se resultatene fra eksempelkoden. Klojureprogrammer er skrevet i skjemaer Skjuler som er innhevet i parentes, angir funksjonssamtaler. kaller funksjonen med argumenter 1 2 3 og returnerer verdien 6, summen av argumenter. Nye funksjoner kan defineres ved hjelp av defn. Here x og y er symboler som representerer inngangsargumentene. Funksjonen kalles for å dele summen av x og y med 2. Merk at skjemaene alltid er i prefiksnotasjon, med funksjon etterfulgt av påfølgende argumenter. Nå kan gjennomsnittet påberopes as. and kommer tilbake 4 I dette eksemplet er gjennomsnitt et symbol, hvis verdi er en funksjon som refererer til for en detaljert forklaring av skjemaer. Klokka gir enkel tilgang til JVM. Dette kalles visningsmetoden på resultatet som bygger en ny Jframe Merk hele stoppet før metoden samt fullstopp etter at konstruksjonen refererer til. Funksjoner kan overføres til andre funksjoner. returer 5 7 9 Kart er en funksjon som tar en annen funksjon og kaller den med argumenter hentet fra følgende samlinger. I vårt tilfelle har vi gitt funksjonen og to vektorer av heltall Resultatet er en liste over resultatene av å ringe med argumenter tatt fra vektorene. Bruke funksjoner som argumenter til andre funksjoner er meget kraftige. Vi kan bruke vår tidligere definerte gjennomsnittlige funksjon med kart som so. returns 5 2 7 2 9 2 Vi ser her at Clojure støtter forhold som en datatype henviser til for en fullstendig liste. Funksjoner kan også returnere andre funksjoner. Her addx vil returnere en ny funksjon som tar 1 argument og legger til x for det. Regner en funksjon som kan kalles med 1 argument og vil legge til 5 til det. returns 6 7 8 9 10 Vi kalte kartet med et resultat av addx, som var en funksjon som tar et argument og legger til 5 Den funksjonen ble kalt på listen over tall vi leverte. Der er en shorthand måte å opprette en navngitt funksjon. Vil lage en funksjon som kaller to argumenter 1 og 2.Vill legg til 5 i listen over tall som vi har gitt. Muligheten til å passere og skape funksjoner dynamisk refereres til som førsteklasses funksjoner. Funksjonell programmering behandler beregning som evaluering av matematiske funksjoner og unngår statlige og mutable data I et imperativt språk vil du vanligvis lage variabler og endre verdi regelmessig. I Clojure returnerer du nye resultater uten å endre hva som var der før. Funksjoner uten bivirkninger Edit. Function side effekter kan endre innstillingsverdiene, endre globale data eller utføre IO. Imperative void moveplayer p, x, y. updates et spillerobjekt med et nytt sted. Object Oriented class player. again, muterer et eksisterende objekt. Funksjonell moveplayer oldp x ya helt ny spiller er returnert, den gamle spilleren er upåvirket. Uansett vet du bare at p har endret seg fordi funksjonsnavnet hint det Og det meg ht har endret andre ting som for eksempel noen verdensdata I FP Oldp er bevart, trenger du ikke å bekymre deg for hva som skjedde med det eller verden - ingenting kan endres, og det er tydelig at en ny spiller returneres som et resultat av å flytte . Hovedfordelene her er begrunnelse, testbarhet og samtidighet Språket håndhever at det ikke er noen bivirkninger, slik at du kan utføre atferd. Innganger direkte kart til utganger som gjør det enklere å konstruere og tenke på testtilfeller. To tråder kan fungere samtidig på samme måte. data uten risiko for at de ødelegger hverandre, da dataene ikke vil bli endret. Ved å fjerne et element fra en liste Den absolutte løsningen ville endre listen på plass. En funksjonell løsning ville returnere en helt ny liste, slik at originalen ble på plass. Dette lyder på overflaten for å være sløsing, men det er mange måter at dette er optimalisert av kompilatoren til å være svært effektiv. Code uten variabler for noen som pleide å tvinge programmering kan ta al ittle blir vant til Her er en rask guide til å konvertere variabel stilkode til funksjonell kode. Du vil akkumulere noen endringer. Rediger disse typer ting i et skjema som ikke krever noen variabler. rekkevidde 1 100 2 skaper en lat rekkefølge 1 3 5 7 99 1 er utgangspunktet, 100 er sluttpunktet, 2 er trinnet reduserer kalles funksjonen Først kalles det med to argumenter, de to første tallene leveres av rekkevidde Da det ringer igjen med det forrige resultatet og det neste nummeret til alle tallene er utmattede. Clojure har mye støtte for sekvenser, samlinger og høyt nivå operasjoner. Når du lærer dem, vil du finne svært uttrykksfulle måter å skrive oppgaver som dette. Du Ønsker å iterere, bruk istedenfor loop-konstruksjonen Redigerer fakultetet av 5 Løypespesialformen etablerer bindinger etterfulgt av uttrykk som skal evalueres I dette eksemplet 5 er bundet til jeg og 1 er bundet til acc. Hvis det spesielle skjemaet tester, om jeg er lik null Da det ikke er lik 0, gjentas gjenta nye verdier til i og acc før retur kontroll tilbake til toppen av sløyfen for å revurdere kroppens uttrykk. En redusert jeg skjønner, jeg er tilbake til jeg og den produkt av acc og jeg acc i er rebound til acc Denne kretsen er rekursivt kalt til jeg er lik 0 akkumulatorer resultatet av å multiplisere hver verdi jeg tok Merk at en binding oppfører seg som en variabel. Også, kan gjentakelse målrette enten en løkke eller funksjonsdefinisjon. over eksempel kan faktorialfunksjonen enten ta 1 argument n som resulterer i evalueringen av. Eller levere 2 argumentresultater i evaluering av. recur er viktig fordi det reagerer på funksjonens innganger i stedet for å legge til et rekursivt kall til stakken. Hadde vi i stedet brukt faktorialdekk n n vi ville ha lignende oppførsel, men for store verdier av n, kan du forårsake en stabel overflyt. Merk også at vi introduserte to definisjoner for faktorial, en med ett argument og en annen med to argumenter Brukeren ringer til en argumentversjon som blir oversatt til de to argumentformene for evaluering Funksjonens aritet er antall argumenter som funksjonen tar. Selvfølgelig kunne vi ha skrevet en enda enklere definisjon lignende til det forrige summe odde eksempelet. Du må lagre et resultat og bruke det flere ganger Edit. There er en nyttig makro let som binder et symbol til en verdi for lokal bruk. i dette la form et tilfeldig tall mellom 0 og 0 8 er genereres, 0 2 legges til, og resultatet er bundet til symbolet g En farge er konstruert med rødgrønne blåverdier av g, som vil være en intensitetsgrense som varierer fra 0 2 til 1. Du vil foreta flere metallsamtaler på samme objekt Edit. Using Java-biblioteker legger deg ofte inn i en situasjon der du vil bruke en lokal variabel Husk doto Den flotte tingen om doto er at den returnerer objektet etter å ha brukt flere samtaler. Bruk permanent tilstandsvariabler Edit. Clojure støtter mange mutable typer, men det er viktig å vite forskjellen mellom dem og hvordan de oppfører seg. De angitte typene er refs, agenter, atomer og vars. Refs er som ref-celler i ML, bokser i Scheme eller pekere på andre språk. Det er en boks, som du kan endre innholdet av Bu t i motsetning til de andre språkene, er vridningen at du bare kan gjøre endringen innsiden av en transaksjon. Dette sikrer at to tråder ikke kan ha en konflikt når du oppdaterer eller får tilgang til det som er lagret inne i ref. declares r for å være en ref med initial verdi av nil. sets r til 5 i en transaction. gets verdien av r, som er 5 Merk at r er stenografi for deref r, og fungerer med alle Clojures mutable typer r selv er en ref, ikke en verdi. Agents Edit. Agents Modifiseres av funksjoner asynkront Du sender en funksjon til agenten, som senere vil bruke den funksjonen til sin nåværende verdi. Det er asynkron fordi anropet sendes tilbake umiddelbart. Funksjonen er i kø i et trådbasseng for utførelse, noe som gir en praktisk tilgang til flere - threading. In dette eksemplet definerte vi en agent med innledende verdi 1 Vi sendte agenten en funksjon inc, som øker argumentet. Nå sendes køer som fungerer for utførelse av et trådbasseng venter, vil blokkere til alle funksjonene som er utestående på en agent h ave fullført returnerer verdien av vår agent, som er nå 2 fordi 1 ble økt. Tomter er endret av funksjoner synkront Du ringer bytte og funksjonen du leverer blir brukt til verdien av atomet før bytteavkastning. Merk som bytter tilbake Resultatet av funksjonen har blitt brukt på nåværende atomverdi Refs koordineres mens agenter og atomer ikke er koordinert. Dette betyr at i et multi-threaded miljø er refs endret i en transaksjon som sikrer at bare en tråd kan endre verdien ved en tid Mens atomer og agenter køer opp forandringsfunksjoner for å sikre at endringene skjer atomalt Alle er trygge, de bruker bare ulike strategier for å gi denne sikkerheten. Forhold er som globale variabler i andre språk Roteringen er en initial standardverdi som er deles av alle tråder Bindekonstruksjonen virker som om varen er blitt endret, men den blir automatisk gjenopprettet til sin tidligere verdi ved å forlate bindingenes omfang ruct. Establishes a Var noe med verdien 5 Deklarerende funksjoner oppretter faktisk dem som Vars Du bør unngå å bruke def og spesielt unngå å sette inn allerede deklarerte bindinger med def. Deretter kalles def. noe 6 er ikke en trådsikker drift. Hvorfor har ikke Clojure lokale variabler et ofte hevet spørsmål. Mutasjon lokalt er like vanskelig å begrunne som mutasjon globalt, uavhengig av samtidighet. Se for eksempel en typisk Java for loop som setter andre lokale vars og inneholder pauser returnerer Hvis det tar mer tro Først og fremst å konstruere løsninger som ikke trenger variabler, prøv å bruke innsatsen - det vil betale deg mange ganger over. Men for å støtte direkte oversettelse av viktige algoritmer, er det en nyttig makro kalt med-lokal-vars som erklærer lokale vars som kan endres med var-set og leses med var-get eller for shorthand. This er en versjon av factorial ved hjelp av variabler Som du kan se er det ikke så fint som versjoner beskrevet tidligere, og er bare å demonstrere en lokal Var-bindende Dette funksjonen er helt trygt å ringe inn i et multi-threaded miljø som variablene er lokale. Men lokale variabler kan ikke få lov til å lekke ut av deres scope. causes Var null er ubundet Årsaken er t hue f returnerer en ny funksjon som legger til 2 til en lokal variabel som er definert i f Så funksjonen som returneres, prøver å holde fast på en lokal variabel av f Nå kan lokale variabler bli endret, men hvis endring skulle skje i et gjenget miljø , og den variabelen hadde lekket utenfor sitt opprinnelige omfang, ville endringen ikke være lokal lenger. Beholdning er et begrep som brukes når symboler blir beholdt utenfor deres definisjon. Her opprettet vi to funksjoner som begge har tilgang til en ref hemmelighet. Vi skapte dem inne i et let , så hemmelig er ikke synlig i vårt nåværende omfang anymore. causes Kan ikke løse symbolhemmelig i denne sammenheng. Men funksjonene selv har beholdt hemmelig og kan bruke den til å kommunisere. Resultater i ingenting. Clojure Flytter gjennomsnitt fra Java til Clojure. Clojure har å jobbe med køer. Jeg vet ikke hvorfor det ikke har en lesermakro, men fungerer fint og gir deg en Clojure-samling du kan håndtere med ulemper og kikk. Du kan starte med en tom kø med eller sett inn elementene dine i konstruktøren. Jeg skrev noe materiale om det på portugisisk hvis du har noen interesse. 20. 07 2014, 08 08 skrev Cecil Westerhof. Jeg lurte bare på hva som er den beste måten å oversette dette på til Clojure. I øyeblikket har Clojure ikke en kø. Skal jeg bare bruke Java-anrop, eller er det en bedre måte .-- Cecil Westerhof - Du har mottatt denne meldingen fordi du abonnerer på Google Gruppens Clojure-gruppe. denne gruppen, send e-post til Merk at innlegg fra nye medlemmer blir moderert - vær tålmodig med ditt første innlegg For å abonnere fra denne gruppen, send epost til clojure For flere alternativer, besøk denne gruppen på --- Du har mottatt denne meldingen fordi du er abonnerer på Google Gruppens Clojure grou p Hvis du vil abonnere fra denne gruppen og slutte å motta e-postmeldinger fra den, send en e-post til For flere alternativer, besøk .-- Du har mottatt denne meldingen fordi du abonnerer på Google Gruppens Clojure-gruppe For å sende inn til denne gruppen, send e-post til Merk at Innlegg fra nye medlemmer blir moderert. Vær så tålmodig med ditt første innlegg. For å abonnere fra denne gruppen, send epost til clojure. For flere alternativer, besøk denne gruppen på --- Du har mottatt denne meldingen fordi du abonnerer på Google Groups Clojure-gruppen til abonnement fra denne gruppen og slutte å motta e-postmeldinger fra den, send en e-post til For flere alternativer, besøk. Mike Fikes Det er faktisk en køimplementasjon. Her er en måte å bruke den på for å løse problemet med å lage en gjennomsnittlig kø n-atom defn oppdatering-flytting-gjennomsnittlig-kø gammel-kø neste verdi la nåværende-totalt nåværende-totalt gammel-kø neste verdi gamle verdier conj gamleverdier gammel-kø neste verdi hvis telle gammelverdier lengde gammel kø forlate nåværende - total - nåværende total først gamle verdier gamle verdier . Det er faktisk en køimplementering. Her er en måte å bruke den på for ditt problem. defn make-moving-gjennomsnittlig-kø n atom nåværende-totalt 0 0 gamle-verdier. defn oppdaterings-flytting-gjennomsnittlig-kø gammel-kø neste verdi la nåværende-totalt nåværende-totalt gammel-kø neste verdi gamle verdier conj gamle verdier gamle kø neste verdi hvis telle gammelverdier lengde gammel kø nåværende-totalt - nåværende-totalt-først-gamle-verdier gamleverdier pop gamle verdier assosiert gammel-kø nåværende-totalt nåværende-totalt gamle verdier gamleverdier tilknyttet gammel-kø nåværende-totalt nåværende-totalt gamle verdier gamle verdier . defn moving-gjennomsnittlig gammel-køs neste verdi, la nykø bytte kjøre-kø-oppdatering-gjennomsnittlig-kø neste verdi nåværende-totalt ny kø-telle gamleverdier ny kø. def queue-06 make-moving-gjennomsnittlig kø 6. def innganger-06 20 22 21 24 24 23 25 26 20 24 26 26 25 27 28 27 29 27 25 24. doseq inngangsinnganger-06 println beveger gjennomsnittlig kø-06 input. def queue-10 make-moving-gjennomsnittlig kø 10. def innganger-10 20 22 24 25 23 26 28 26 29 27 28 30 27 29 28. doseq inngangsinnganger -10 println flytende gjennomsnittlig kø-10 inngang .-- Du mottatt denne meldingen fordi du abonnerer på Google Groups Clojure-gruppen For å sende inn til denne gruppen, send e-post til Merk at innlegg fra nye medlemmer blir moderert - vær tålmodig med ditt første innlegg For å abonnere fra denne gruppen, send epost til clojure For mer alternativer, besøk denne gruppen på --- Du har mottatt denne meldingen fordi du abonnerer på Google Gruppens Clojure-gruppen. Hvis du vil abonnere fra denne gruppen og slutte å motta e-postmeldinger fra den, send en epost til For flere alternativer, besøk. Mike Fikes Hey Cecil, I tillegg til å bruke tittel i stedet for først, som angitt av Plinio, bruker den bevegelige gjennomsnittsfunksjonen ovenfor noen dårlige navn, i ettertid, spesielt parameteren for gamle kø-parameteren jeg foreslår å navngi den køen, som den refererer til et atom. Du kunne til og med vurdere å navngi funksjonen flytende gjennomsnitt - Du har mottatt th er beskjed fordi du abonnerer på Google Gruppens Clojure-gruppe For å sende inn til denne gruppen, send epost til e-postbeskyttet. Vær oppmerksom på at innlegg fra nye medlemmer er. at 20. juli 2014 kl. 52. I tillegg til å bruke titt i stedet for først, Som angitt av Plinio, bruker den bevegelige gjennomsnittsfunksjonen ovenfor noen dårlige navn, i ettertid, spesielt parameteren for gamle kø-parameteren jeg foreslår å navngi den køen, som den refererer til et atom. Du kan til og med vurdere å navngi funksjonen flytende gjennomsnitt. - Du har mottatt denne meldingen fordi du abonnerer på Google Groups Clojure-gruppen For å sende inn til denne gruppen, send e-post til Merk at innlegg fra nye medlemmer blir moderert - vær tålmodig med ditt første innlegg For å abonnere fra denne gruppen, send epost til clojure For flere alternativer, besøk denne gruppen på --- Du har mottatt denne meldingen fordi du abonnerer på Google Groups Clojure-gruppen. Hvis du vil abonnere fra denne gruppen og slutte å motta e-postmeldinger fra den, send en epost til For flere alternativer, besøk. Jony Hudson P Robably ikke svaret du leter etter, men det eksponentielt vektede glidende gjennomsnittet krever ikke noen annen stat enn den nåværende verdien defn ewma alpha fn avg ny - 1 alpha avg alpha new Jony - Du mottok denne meldingen fordi du abonnerer på Google Gruppens Clojure-gruppe For å sende inn til denne gruppen, send epost til e-postbeskyttet. Vær oppmerksom på at innlegg fra nye medlemmer blir moderert. Vær så tålmodig med ditt første innlegg. For å abonnere fra denne gruppen, send. På søndag 20. juli 2014 12 48 19 UTC 1 skrev Cecil Westerhof. Det er en bedre måte. Det er ikke sikkert svaret du leter etter, men det eksponentielt vektede glidende gjennomsnittet krever ikke noen annen stat enn dagens verdi. defn ewma alpha fn avg ny - 1 alpha avg alpha new .-- Du har mottatt denne meldingen fordi du abonnerer på Google Gruppens Clojure-gruppe. For å sende inn til denne gruppen, send e-post til Merk at innlegg fra nye medlemmer blir moderert - vær tålmodig 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.

No comments:

Post a Comment