Skip to main content

Moving Genomsnittet Clojure


I helgen bestämde jag mig för att försöka min hand i Scala och Clojure. Jag är skicklig med objektorienterad programmering, och så var Scala lätt att hämta som ett språk, men ville prova funktionell programmering. Det här var det svårt. Jag kan bara T verkar få huvudet till ett sätt att skriva funktioner Som en expertfunktionell programmerare, hur närmar du dig ett problem. Ge en lista med värden och en definierad summationstid, hur skulle du skapa en ny lista med det enkla glidande medlet av listan. För exempel Med tanke på listvärdena 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 och perioden 4, bör funktionen returnera 0 0 , 0, 0 0, 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5. Efter att ha spenderat en dag på att mulla över det var det bästa jag kunde komma med i Scala detta. Jag vet det här är fruktansvärt ineffektivt, jag vill hellre göra något liknande. Nu skulle det enkelt bli gjort i en tvingande stil, men jag kan för mig avgöra hur man uttrycker det funktionellt. Intressant problem jag kan tänka på ma ny lösningar med varierande grad av effektivitet Att behöva lägga till saker upprepade gånger är inte ett prestanda problem, men låt oss anta att det också kan nollorna i början läggas på senare, så låt oss inte oroa sig för att producera dem. Om algoritmen ger de är naturligtvis bra, om inte, vi korrigerar det senare. Börja med Scala 2 8, skulle följande ge resultatet för n period genom att använda glidning för att få ett glidfönster i listan. Trots att det här är ganska elegant, gör det inte har bästa möjliga prestanda, eftersom det inte utnyttjar redan beräknade tillägg. Så talar vi om dem, hur kan vi få dem. Låt oss säga att vi skriver detta. Vi har en lista över summan av varje par. Låt oss försöka Använd detta resultat för att beräkna det rörliga genomsnittet av 4 element. Ovanstående formel gjorde följande beräkning. Så om vi tar varje element och lägger till det till nästa nästa element får vi det glidande medlet för 4 element. Vi kan göra det så här. Vi kunde då beräkna det rörliga genomsnittet för 8 element och så vidare Tja, det finns en välkänd algoritm för att beräkna saker som följer ett sådant mönster Det är mest känt för dess användning vid beräkning av kraften i ett nummer Det går så här. Så, låt oss tillämpa det här. Så , Här är logikperioden 0 ogiltig, period 1 är lika med ingången, period 2 är glidningsfönstret av storlek 2 Om det är större än så kan det vara jämnt eller udda. Om det är konstigt lägger vi till varje element i rörelsens nästa udda - 1 element Till exempel, om 3 lägger vi till varje element i movingSum av de följande 2 elementen. Om vi ​​beräknar det movingSum för n 2 lägger vi sedan till varje element i ett n 2 steg efteråt. Med den här definitionen, Vi kan sedan gå tillbaka till problemet och göra det. Det är en liten ineffektivitet med avseende på användningen av men det är o period, inte Det kan bli effektivare med en rekursiv funktion i svansen Och såklart är definitionen av glidning I förutsatt att det är skrämmande prestationsförvisande, men det kommer att bli en mycket bättre definition av det på Scala 2 8 Observera att vi inte kan göra en Effektiv glidmetod på en lista men vi kan göra det på en Iterable. Having sagt allt det, jag går med den allra första definitionen och optimerar bara om en kritisk sökväg analyserade detta som en stor sak. Till avsluta, låt oss överväga hur jag gick om problemet Vi har ett glidande medelvärde Ett glidande medelvärde är summan av ett rörligt fönster i en lista, dividerat med storleken på det här fönstret Så först försöker jag få ett glidande fönster, summa allt på det, Och sedan dela med sig av storleken. Nästa problem var att undvika repetition av redan beräknade tillägg. I det här fallet gick jag till det minsta möjliga tillägget och försökte räkna ut hur man beräknar större summor om att använda sådana resultat. Slutligen, försök att Lösa problemet som du tänkte på det genom att lägga till och subtrahera från föregående resultat. Få det första genomsnittet är enkelt. Nu gör vi två listor Först, listan över element som ska subtraheras. Nästa, listan över element som ska läggas till. Vi kan Lägg till dessa två listor med hjälp av zip. Denna metod kommer endast att producera uce så många element som den mindre listan har, vilket undviker att problemet att subtrahera är större än nödvändigt. Vi avslutar genom att komponera resultatet med en vik. Vilket är svaret som ska returneras Hela funktionen ser ut så här. Jag vet Clojure bättre än Scala, så här går När jag skriver detta är den andra Clojure-posten här absolut nödvändig att det inte är riktigt vad du återvänder och inte är idiomatisk Clojure Den första algoritmen som kommer att tänka mig, tar upprepade gånger det önskade antalet element från sekvensen och släpper Det första elementet och återkommande. Följande fungerar på någon form av sekvensvektor eller lista, lat eller inte och ger en lat sekvens av medelvärden --- vilket kan vara till hjälp om du arbetar på en lista med obestämd storlek Observera att det tar vård av basfallet genom att implicit returnera noll om det inte finns tillräckligt med element i listan att konsumera. Kör detta på dina testdata. Det ger inte 0 för de första elementen i sekvensen, men det kan lätt hanteras lite vad artificially. The lättaste sak av allt är att se mönstret och kunna komma ihåg en tillgänglig funktion som passar billpartitionen ger en lat vy över delar av en sekvens som vi då kan kartlägga. Någon bad om en svans recursiv version svans recursion vs latskap är lite av en tradeoff När ditt jobb bygger upp en lista så gör din funktion svans rekursiv är vanligtvis ganska enkel, och detta är inget undantag --- bygga bara upp listan som ett argument till en subfunction Vi kommer att ackumulera till en vektor istället för en lista eftersom annars listan kommer att byggas upp bakåt och måste vändas i slutet. Loop är ett sätt att göra en anonym inre funktion som, till exempel, Scheme s heter let recur måste användas i Clojure för att eliminera svanssamtal är conj en generaliserad nackdel som lägger till på det sätt som är naturligt för insamlingen --- början av listor och slutet av vektorer. svarade aug 24 09 vid 2 58. Jag har bestämt mig för att lägga till denna gamla Q, Eftersom ämnet kom upp igen och jag f Det är föredraget att peka på den här fina samlingen av möjliga lösningar samtidigt som jag lägger till en egen tag som skiljer sig från tidigare versioner i Clojure, som förklaras i A. Kanske kan vi bygga webbens mest kompletta arkiv av funktionella mov-avg-implementeringar - Micha Marczyk Mar 2 10 på 0 20.Här sa delvis punktfri en linje Haskell lösning. Första gäller att svansar till listan för att få svans listor, så. Vändar det och släpper de första p-poster som tar p som 2 här. Om du känner inte till symbolen för punktnippel, det är operatören för funktionell komposition, vilket innebär att den överför utgången från en funktion som ingången till en annan, som komponerar dem i en enda funktion gf betyder att run f är ett värde och sedan överför utgången till g , så fgx är densamma som gfx Generellt leder användningen till en tydligare programmeringsstil. Det kartlägger sedan funktionen frånIntegral p sum tar p på listan Så för varje lista i listan tar det de första p-elementen, summerar dem och delar sedan dem av p då vi flipar bara listan igen med omvändt. Det här ser mycket mer ineffektivt ut än det är omvändt, men det går inte att fysiskt vända ordningens lista tills listan är utvärderad. Den lägger bara ut på stapeln. Bra och lata Haskell-svansar Skapar inte alla de separata listorna, det refererar bara till olika delar av originallistan. Det är fortfarande inte en bra lösning, men den är en linje lång. Här är något snyggare men längre lösning som använder MapAccum för att göra en glidande subtraktion och addition. Vi delar upp listan i två delar på p, så. Sum den första biten. Tyck den andra biten med den ursprungliga listan. Detta bara parar av objekt i ordning från de två listorna. Den ursprungliga listan är uppenbarligen längre men vi förlorar denna extra bit. Nu definierar vi en funktion för vår kartaAccum ulator mapAccumL är samma som karta, men med en extra löpande ackumulatorparameter som går från den föregående mappningen till nästa när kartan går igenom listan Vi använder ackumulatorn som vårt glidande medelvärde , och eftersom vår lista är formad av det element som just har lämnat glidfönstret och det element som bara har skrivit in den listan vi bara har zippat tar vår glidande funktion det första talet x bort från medelvärdet och lägger till det andra numret y Vi då Passera de nya s längs och återvända s dividerad med p snd sekund tar bara den andra medlemmen av ett par tupel, som används för att ta det andra returvärdet av mapAccumL, eftersom mapAccumL kommer att returnera ackumulatorn såväl som den tilldelade listan. För dem Av dig inte bekant med symbolen det är applikationsoperatören. Det gör inte riktigt något, men det har en låg, höger-associativ bindande företräde, så det betyder att du kan lämna ut parenteserna notera LISPers, iefx är detsamma som f X. Running ma 4 2 0, 40, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 40, 1 0 ger 4 75, 50, 0, 7 25, 80, 8 25, 6 5 för antingen lösning. Och du måste importera modullistan för att kompilera endera lösningen. Daniel Tack Skriv kod är mycket lättare än att förklara det. Du har beskrivit det här. Två listor Strömmar bibehålls i båda funktionerna och får huvudet avstängt under varje iteration. En lista Stream fungerar som huvudsamlingen för att iterera igenom medan den andra List Stream, som är samma samling med undantag av period mindre Dubblar som tagits av den, används vid beräkningen av det nya glidande medlet Walter Chang aug 24 09 på 17 19.J programmeringsspråket underlättar program som rörande medelvärde. Det finns faktiskt Färre tecken än i deras etikett, glidande medelvärde. För de värden som anges i denna fråga inklusive namnetvärdena här är ett enkelt sätt att koda detta. Vi kan beskriva detta med hjälp av etiketter för komponenter. Båda exempel använder exakt samma program Den enda Skillnad är användningen av flera namn i den andra formen. Sådana namn kan hjälpa läsare som inte vet J-primarierna. Låt oss titta lite längre på vad som händer i delprogrammet, medelvärdet d antecknar summation och betecknar division som det klassiska tecknet Beräkning av ett talantal av objekt görs av det övergripande programmet, då är summan av värden dividerat med värdet av värden. Resultatet av den genomsnittliga beräkning som skrivs här inkluderar inte ledande nollor förväntas i den ursprungliga frågan Dessa nollor är förmodligen inte en del av den avsedda beräkningen. Tekniken som används här kallas tyst programmering. Det är ganska mycket detsamma som den fria stilen för funktionell programmering. Ansvarig aug 26 10 vid 16 15. Här är Clojure som låtsas vara ett mer funktionellt språk Det här är helt svansrekursivt, btw och innehåller ledande nollor. Jag sätter ihop samlings - eller listparametern senast för att göra funktionen lättare att curry Men i Clojure. is är jag så besvärlig att jag brukar sluta göra detta. I vilket fall spelar det ingen roll vilken ordning parametrarna går. Svarade aug 24 09 på 4 56. Han Jonathan, jag är ganska ny på denna funktionella programmering, kan du tacka för mig hur är är rekursivt Tack James P Aug 24 09 vid 14 38. Rekursionen händer på if-satsen, där antingen alternativet är baserat på återkommande. Detta kommer att beräkna varje parameter först och endast sedan recurse. Svaret kommer att bli resultatet av återkommande As Resultatet är det samma resultatet som återkommer av rekursionen, utan några andra beräkningar, det här är rekursivt svans Daniel C Sobral Aug 24 09 på 15 20.Detta exempel använder sig av staten, eftersom det är en pragmatisk lösning i detta fall och en Stängning för att skapa windowing medelvärde funktion. Det är fortfarande funktionellt i den meningen att använda första klassens funktioner, men det är inte bieffektfri De två språken du nämnde båda körs på toppen av JVM och därmed båda tillåta tillstånds - Ledning när det behövs. Svarade aug 24 09 på 1 55. Den här lösningen är i Haskell, vilket är mer bekant för mig. Svarade aug 24 09 på 10 23. Jag gillar att använda matchmeddelandet försökte göra något liknande men kunde inte Gör det hela vägen där James P Aug 24 09 at 14 39. En kort Clojure-version som har fördelen att vara O-listlängd oavsett din period. Detta utnyttjar det faktum att du kan beräkna summan av ett antal tal genom att skapa en kumulativ summa av sekvensen t. ex. 1 2 3 4 5 - 0 1 3 6 10 15 och sedan subtrahera de två siffrorna med en förskjutning som är lika med din period. När jag kom sent på festen och ny till funktionell programmering kom jag till denna lösning med en inre funktion. Jag antog idén att Dela upp hela listan med perioden i förväg Då genererar jag summan som börjar med de första elementen och jag genererar de första og ogiltiga elementen 0 0, 0 0. Sedan rekursivt rekryterar jag det första och lägger till det sista värdet I slutet listar jag hela grejen. Ansökad 29 april 10 kl 19 28. I Haskell pseudokod. Nu borde man verkligen abstrahera 4 out. answered 23 juli 13 på 13 45. Nyckeln är svansfunktionen, som kartlägger en lista på en lista med kopior av originallistan, med egenskapen att n: e elementet i resultatet saknar de första n-1 elementen. Vi tillämpar fmap avg ta n till resultatet, vilket innebär att vi tar n-längd prefixet från dellistan och beräknar dess avg Om längden på listan vi är avg ing inte n, Då beräknar vi inte genomsnittet eftersom det är odefinierat. Då returnerar vi ingenting. Om det är gör vi det och slår det in. Bara Slutligen kör vi catMaybes på resultatet av fmap avg take n, för att bli av med kanske Type. answered 21 okt 13 på 1 29. Jag blev förvånad över och uppskattad av resultatet av vad som tycktes mig vara de mest idiomatiska Clojure-lösningarna, JamesCunninghams lata-seq-lösningar. Så här är en kombination av James-lösning med s idé om att anpassa snabb - Exponentiation till rörliga summor. Ändra den här baserade på mikas s-lösning - är ännu snabbare. Svarat 22 juli kl 13 på 19 21. Din Svar.2017 Stack Exchange, Inc. Clojure Programmering enligt exempel. Detta är tänkt att vara en hand om att först titta på Clojure Om du vill prova exemplen när du går, kanske du redan har skapat en arbetsmiljö enligt så att du kan se resultaten av exempelkoden. Klojyrprogrammen är skrivna i formulär. Former som bifogas parentes anger funktionssamtal. uppmanar funktionen med argument 1 2 3 och returnerar värdet 6, summan av argument. Nya funktioner kan definieras med hjälp av defn. Here x och y är symboler som representerar inmatningsargumenten Funktionen kallas för att dividera summan av x och y med 2 Observera att formulär alltid finns i prefixnotation, med funktion följt av efterföljande argument Nu kan genomsnittet åberopas as. and återkommer 4 I det här exemplet är medelvärdet en symbol vars värde är en funktion som hänvisar till för en detaljerad förklaring av formulär. Klojure ger enkel åtkomst till JVM. Detta kallar visningsmetoden på resultatet som bygger en ny Jframe Observera hela stoppet innan metodsamtalet och fullstoppet efter att konstruktionen hänvisas. Funktioner kan vidarebefordras till andra funktioner. returner 5 7 9 Kartan är en funktion som tar en annan funktion och kallar den med argument som tagits från följande samlingar I vårt fall har vi gett funktionen Och två vektorer av heltal Resultatet är en lista över resultaten av att ringa med argument som tas från vektorerna. Användning av funktioner som argument till andra funktioner är mycket kraftfull. Vi kan använda vår tidigare definierade genomsnittsfunktion med karta som so. returns 5 2 7 2 9 2 Vi ser här att Clojure stöder förhållanden som datatyper hänvisar till för en fullständig lista. Funktioner kan också återvända till andra funktioner. Här addx kommer att returnera en ny funktion som tar 1 argument och lägger till x till det. Rår en funktion som kan kallas med 1 argument och lägger till 5 till it. returns 6 7 8 9 10 Vi kallade karta med ett resultat av addx, vilket var en funktion som tar ett argument och lägger till 5 Den funktionen lyssnade på listan över nummer vi levererade. Där är en Shorthand sätt att skapa en namnlös funktion. Vill skapa en funktion som samlar med två argument 1 och 2.Vill lägg till 5 i listan över siffror som vi tillhandahållit. Förmågan att överföra och skapa funktioner dynamiskt kallas förstklassiga funktioner. Funktionell programmering Behandlar beräkningen som utvärdering av matematiska funktioner och undviker statliga och muterbara data I ett imperativt språk skulle du vanligtvis skapa variabler och ändra deras värde regelbundet. I Clojure returnerar du nya resultat utan att ändra vad som var där tidigare. Funktioner utan biverkningar Edit. Function sida Effekter kan ändra värdena på inmatningar, ändra globala data eller utföra IO. Imperative void moveplayer p, x, y. updates ett spelarobjekt med en ny plats. Object Oriented class player. again, muterar ett befintligt objekt. Funktionella moveplayer oldp x ya helt ny spelare returneras, den gamla spelaren är opåverkad. I absolut nödvändigt vet du bara att p har ändrats eftersom funktionsnamnet antyder det och det mig ht har ändrat andra saker som till exempel vissa världsdata. I FP Oldp bevaras behöver du inte oroa dig för vad som hände med det eller världen - ingenting kan förändras och det är tydligt att en ny spelare returneras som ett resultat av att flytta . De främsta fördelarna här är resonemang, testbarhet och samtidighet Språket styrker att det inte finns några biverkningar så att du kan avleda beteendet Inmatar direkt karta till utgångar som gör det lättare att konstruera och tänk på testfall Två trådar kan fungera samtidigt på samma sätt data utan risk för att de skadar varandra eftersom uppgifterna inte kommer att ändras. Undersökande av ett objekt från en lista Den nödvändiga lösningen skulle ändra listan på plats En funktionell lösning skulle returnera en helt ny lista och lämna originalet på plats. Detta Låter på ytan vara slöseri, men det finns många sätt att detta optimeras av kompilatorn för att vara mycket effektivt. Kod utan variabler för någon som används för att nödvändig programmering kan ta ut Ittle vänja sig här Här är en snabb guide för att konvertera variabel stilkod till funktionell kod. Du vill ackumulera några ändringar Redigera. Omställ dessa typer av saker i en form som inte kräver några variabler. Intervall 1 100 2 skapar en lat sekvens av siffror 1 3 5 7 99 1 är utgångspunkten, 100 är slutpunkten, 2 är steget reducerar samtalet funktionen Först ringer det med två argument, de två första siffrorna som levereras av intervallet Sedan det ringer igen med föregående resultat och nästa nummer tills alla siffror är uttömda. Clojure har mycket stöd för sekvenser, samlingar och högnivåoperationer När du lär dig dem hittar du väldigt uttrycksfulla sätt att skriva uppgifter som detta. Du vill iterera, istället använda slingan återuppbygga Editputes den factorial av 5 Slingans specialformulär etablerar bindningar följt av uttryck som ska utvärderas I detta exempel 5 är bunden till jag och 1 är bunden till acc Den om speciell form testa då om jag är Lika med noll Eftersom det inte är lika med 0, återkommer återkommande nya värden till i och acc innan du återvänder kontrollen till toppen av slingan för att omvärdera kroppen av dess uttryck. En minskning av att jag kommer tillbaka till jag och Produkt av acc och jag acc i är rebound till acc Den här slingan kallas rekursivt tills jag motsvarar 0 acc-butiker resultatet av att multiplicera varje värde som jag tog Observera att en bindning beter sig som en variabel. Också, återkommande kan rikta sig antingen på en slinga eller funktionsdefinition. Ovanstående exempel kan den faktoriella funktionen antingen ta 1 argument n vilket resulterar i utvärderingen av. Eller leverera 2 argument resulterar i utvärdering av. recur är viktigt eftersom det återfår funktionens ingångar istället för att lägga till ett rekursivt samtal till stapeln Hade vi i stället använde fakultetsdefinitionen vi skulle ha liknande beteende, men för stora värden på n kan du orsaka en stapelflöde. Observera också att vi införde två definitioner för faktoriell, en med ett argument och en annan med två argument. Användaren ringer En argumentversion som översätts till de två argumentformen för utvärdering Funktionen är en del argument som funktionen tar. Naturligtvis kunde vi ha skrivit en ännu enklare definition liknande till föregående summa udda exempel. Du måste spara ett resultat och använda det flera gånger Edit. There är ett användbart makro låt som binder en symbol till ett värde för lokal användning. i detta låt form ett slumptal mellan 0 och 0 8 är Genereras, 0 2 läggs till och resultatet är bundet till symbolen g En färg är konstruerad med röda grönblå värden på g, som kommer att vara en gråskala av intensitet som sträcker sig från 0 2 till 1.Du vill göra flera metodsamtal På samma objekt Edit. Using Java-biblioteken sätter dig ofta i en situation där du vill använda en lokal variabel. Tänk på doto Det fantastiska med doto är att det returnerar objektet efter att ha tillämpat flera samtal. Använda permanenta tillståndsvariabler. Edit. Clojure stöder många mutable typer, men det är viktigt att känna skillnaden mellan dem och hur de beter sig. De angivna typerna är refs, agenter, atomer och vars. Refs är som ref-celler i ML, rutor i Scheme eller pekare på andra språk. Det är En låda, så att du kan ändra innehållet i Bu T till skillnad från de andra språken är vridningen att du bara kan göra förändringen inuti en transaktion. Detta säkerställer att två trådar inte kan uppstå konflikter vid uppdatering eller åtkomst till det som lagras inuti ref. declares r för att vara en ref med initialvärdet av Nil. sets r till 5 i en transaction. gets värdet av r, vilket är 5 Observera att r är stenografi för deref r, och fungerar med alla Clojures mutable typer r är själv en ref, inte ett värde. Agents Edit. Agents Modifieras av funktioner asynkront Du skickar en funktion till agenten, som senare kommer att applicera den funktionen till dess nuvarande värde. Det är asynkront eftersom samtalet skickas direkt. Funktionen är köad i en trådpool för körning, vilket ger en bekväm tillgång till flera - threading. In detta exempel definierade vi en agent med initialvärde 1 Vi skickade agenten en funktion inc som ökar dess argument Nu skickas köer som fungerar för utförande av en trådpool väntar kommer att blockera tills alla funktioner som är utestående på en agent h Ave slutfört returnerar värdet av vår agent, vilket är nu 2, eftersom 1 ökades. Tomterna modifieras av funktioner synkront Du ringer byte och funktionen du tillhandahåller appliceras på atomens värde före byte av retur. Notera som byter avkastning Resultatet av funktionen har applicerats på det aktuella atomvärdet Refs samordnas medan agenter och atomer är okoordinerade. Det betyder att i en tråd med flera gängor ändras refs i en transaktion som säkerställer att endast en tråd kan modifiera värdet vid en Tid Atomer och agenter köper förändringsfunktioner för att säkerställa att förändringarna sker atomiskt Alla är säkra, de använder bara olika strategier för att ge denna säkerhet. Var som globala variabler på andra språk Rödenbindningen är ett initialt standardvärde som är delas av alla trådar Den bindande konstruktionen verkar som om varen har ändrats men det återställs automatiskt till sitt tidigare värde när man lämnar bindningskonstans omfattning Ruct. Establishes a Var något med värdet 5 Deklarera funktioner faktiskt etablerar dem som Vars Du borde undvika att använda def och speciellt undvika att ställa in redan förklarade bindningar med def. Efterföljande anrop är något 6 inte en trådsäker operation. Varför inte Clojure har lokala variabler är en ofta upphöjd fråga. Mutation lokalt är lika svår att förnuftas om som mutation globalt oberoende av samtidighet Se till exempel en typisk Java-loop som sätter annan lokal vars och innehåller rasteravkastning Om det tar mer tanke Först och främst att konstruera lösningar som inte behöver variabler, försök att satsa på ansträngningarna - det kommer att betala dig många gånger över. Men för att stödja direkt översättning av tvingande algoritmer finns det ett användbart makro kallat med-lokal-vars som förklarar lokala vars som kan ändras med var-set och läsas med var-get eller for shorthand. This är en version av factorial med variabler Som du kan se är det inte lika trevligt som de tidigare beskrivna versionerna och är rent för att visa en lokal Var-bindande Detta Funktionen är helt säker att ringa in i en tråd med flera trådar eftersom variablerna är lokala. Men lokala variabler kan inte tillåtas läcka ut ur deras scope. causes Var null är obundet Begrundan är t hat f returnerar en ny funktion som lägger till 2 till en lokal variabel definierad i f Så återgår funktionen till en lokal variabel av f Nu kan lokala variabler ändras men om förändringar skulle ske i en tråd med flera trådar , och den variabeln hade läckt utanför sin ursprungliga räckvidd, skulle förändringen inte vara lokal längre. Klockning är en term som används när symboler behålls utanför deras definition. Här skapade vi två funktioner som båda får tillgång till en hemlighet Vi skapade dem inuti ett låt , Så hemlighet är inte synlig i vårt nuvarande räckvidd anymore. causes Det går inte att lösa symbolhemligheten i det här sammanhanget. Men funktionerna själva har behållit hemlighet och kan använda den för att kommunicera. Resultat i ingenting. Clojure Flyttande medelvärde från Java till Clojure. Clojure har a att arbeta med köer Jag vet inte varför det inte har ett läsarmakro men fungerar bra och ger dig en Clojure-samling du kan hantera med nackdelar och kik. Du kan börja med en Tom kö med eller sätta in dina föremål i konstruktören. Jag skrev något material om det på portugisiska om du hade något intresse. Den 20 07 2014, vid 08 48 skrev Cecil Westerhof. Jag undrade bara vad som är det bästa sättet att översätta detta Till Clojure. I det ögonblicket har Clojure inte en kö. Ska jag bara använda Java-samtal, eller finns det ett bättre sätt .-- Cecil Westerhof - Du har fått det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp. den här gruppen, skicka e-post till Observera att inlägg från nya medlemmar är modererade - var uppmärksam på ditt första inlägg För att avmelde dig från den här gruppen, skicka e-post till clojure För fler alternativ, besök den här gruppen på --- Du fick det här meddelandet eftersom du är Prenumererade på Google Groups Clojure grou p För att avbryta abonnemanget från den här gruppen och sluta ta emot e-postmeddelanden från det, skicka ett mail till För fler alternativ, besök .-- Du har fått det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp. För att skicka in till den här gruppen, skicka e-post till Obs Inlägg från nya medlemmar är modererade - var uppmärksam på ditt första inlägg För att avmelde dig från den här gruppen, skicka e-post till clojure För fler alternativ, besök den här gruppen på --- Du fick det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp till Avbryta prenumerationen från den här gruppen och sluta ta emot e-postmeddelanden från det, skicka ett mail till För fler alternativ, besök. Mike Fikes Det är faktiskt en köimplementering Här är ett sätt att använda det för ditt problem att skydda medel-kö-n-atom uppdatering-moving-genomsnittlig-kö gammal kö nästa värde låt nuvarande-totalt nuvarande-totalt gammal-kö nästa värde gamla-värden conj gamla-värden gammal-kö nästa värde om räkna gammalvärden längd gammal kö låt nuvarande - total - nuvarande totalt första gamla värden gamla värden . Det är faktiskt en köimplementering Här är ett sätt att använda det för ditt problem. Defn make-moving-genomsnittlig-kö n atomström-totalt 0 0 gamla värden. Defn uppdatering-moving-genomsnittlig-kö gammal kö nästa värde låt nuvarande-totalt nuvarande-totalt gammal kö nästa värde gammal-värden conj gamla-värden gammal-kö nästa värde om räkna gamla värden längd gammal kö låt Nuvarande summa - nuvarande totalt första gamla värden gamla värden pop gamla värden assoc gamla kön nuvarande-totalt nuvarande-totalt gamla värden gamla värden assoc gamla kön nuvarande-totalt nuvarande-totalt gamla värden gamla värden . Defn moving-average gammal kön nästa värde låta ny kö köla gamla kö köpare uppdatering-moving-genomsnittliga kö nästa värde nuvarande totalt kö kö gamla värden nykö. Def queue-06 make-moving-average-que 6. def ingångar-06 20 22 21 24 24 23 25 26 20 24 26 26 25 27 28 27 29 27 25 24. doseringsinmatningsingångar-06 println moving-average queue-06 inmatning. def queue-10 make-moving-average-que 10. def-ingångar -10 20 22 24 25 23 26 28 26 29 27 28 30 27 29 28. doseringsinmatningsingångar -10 println rörlig genomsnittskö-10 ingång .-- Du Mottog det här meddelandet eftersom du prenumererar på gruppgruppen Clojure-gruppen. Om du vill skicka in till den här gruppen skickar du e-post till Obs! Inlägg från nya medlemmar är modererade. Var vänliga med ditt första inlägg. För att avmelde dig från den här gruppen, skicka e-post till clojure. Alternativ, besök den här gruppen på --- Du har fått det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp. För att avbryta abonnemang från den här gruppen och sluta ta emot e-postmeddelanden från den, skicka ett mail till För fler alternativ, besök. Mike Fikes Hey Cecil, Förutom att använda titt i stället för först, som anges av Plinio, använder den rörliga genomsnittsfunktionen ovan några dåliga namn, i efterhand, speciellt namnet på gammal köparametrar jag d för att beteckna det kö, eftersom det refererar till en atom. Du kan även överväga att namnge funktionen i rörelse-genomsnittet - Du har tagit emot den är ett meddelande eftersom du prenumererar på Google Groups Clojure-gruppen För att skicka till den här gruppen, skicka e-post till e-postskyddad Observera att inlägg från nya medlemmar är. at 20 juli 2014 kl. 52. Förutom att använda titt i stället för först, Som framgår av Plinio använder den rörliga genomsnittsfunktionen ovan några dåliga namn, i efterhand, i synnerhet det gamla könparameterns namn som jag föreslår att det kallas kö, som det hänvisar till en atom. Du kan till och med överväga att namnge funktionen glidande medelvärde. - Du har fått det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp. Om du vill skicka in till den här gruppen skickar du e-post till Observera att inlägg från nya medlemmar är modererade. Var vänlig med ditt första inlägg. För att avmelde dig från den här gruppen, skicka e-post till clojure För fler alternativ, besök den här gruppen på --- Du har fått det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp. Om du vill avsluta prenumerationen från den här gruppen och sluta ta emot e-postmeddelanden, skicka ett mail till För fler alternativ, besök. Jony Hudson P Robust inte svaret du letar efter, men det exponentiellt viktade glidande genomsnittet kräver inte något annat tillstånd än det nuvarande värdet defn ewma alpha fn avg new - 1 alfa avg alpha new Jony - Du fick det här meddelandet eftersom du prenumererar på Google Gruppens Clojure-grupp För att skicka in till den här gruppen, skicka e-post till e-postskyddad Observera att inlägg från nya medlemmar är modererade - var patienten med ditt första inlägg. För att avbryta abonnemanget från den här gruppen, skicka. På söndagen den 20 juli 2014 12 48 19 UTC 1 skrev Cecil Westerhof. Det finns ett bättre sätt. Förmodligen inte svaret du letar efter, men det exponentiellt viktade glidande genomsnittet kräver inte något annat tillstånd än det nuvarande värdet. Defn ewma alpha fn avg new - 1 alfa avg alpha new .-- Du har fått det här meddelandet eftersom du prenumererar på gruppgruppen Clojure-gruppen. För att skicka till den här gruppen, skicka e-post till Obs! Inlägg från nya medlemmar modereras 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 from this blog

There Are Only 10 Typer Binära Alternativ

Vad du behöver veta om binära alternativ utanför U. S.Binary-alternativen är ett enkelt sätt att handla prisfluktuationer på flera globala marknader, men en näringsidkare behöver förstå riskerna och belöningen för dessa ofta missförstådda instrument. Binära alternativ skiljer sig från traditionella Alternativ Om handlas kommer man att finna att dessa alternativ har olika utbetalningar, avgifter och risker, för att inte tala om en helt annan likviditetsstruktur och investeringsprocess. För relaterad läsning, se En guide till handel binära alternativ i U S. Binary alternativ som handlas utanför USA är också typiskt strukturerad annorlunda än binärer som är tillgängliga på amerikanska börser. När man överväger att spekulera eller säkra binära alternativ är ett alternativ, men endast om näringsidkaren fullt ut förstår de två potentiella resultaten av dessa exotiska alternativ. I juni 2013 varnade amerikanska värdepappers - och utbyteskommittéerna om investerare om De potentiella riskerna m...

Pin Bar Återföring Strategi

Pin Bar Forex Trading Strategy. Pin bar handelsstrategi är en prisåtgärd återföring handel setup som kan användas för att tjäna pengar från marknaderna när de används korrekt. I den här lektionen kommer vi att förklara vad en pinbar är och hur man använder en när du ser det på rätt sätt för att skapa lönsamma affärer på marknaden. Vad är en Pin Bar Hur definierar du det. Vi vet alla historien om Pinocchio pojken vars näsa växte längre när som helst han berättade en lögn En pinbar kallas också en Pinocchio-bar eftersom det berättar för oss att marknaden ligger och längden på stiftet indikerar Pinocchios förlängningsnos. När marknadspriset rör sig i riktning mot trenden upp till en viss nivå, drar den plötsligt hela vägen tillbaka till nära öppningspriset Således ljög det var priset var på väg. Ett stift omslagsmönster består av en lång wick och en liten kropp som kan sträcka sig över eller under kroppen. De kan lätt identifieras på dina diagram med lite övning. Avslaget på pri ce riktni...

Quero Investir Em Forex

Olha så karto de dbito da XAPO que mudou a minha vida Oss-o o dos os dias inte estu en pensar annullera o meu carto de dbito do Banco sensacional. Primeiro que tudo tenho que pedir avkalka oss för att se bloggar, bloggar och inte när du är med dig, så är det dags att göra bloggar, du kommer att vara med och fortsätta att göra en förskingring, så länge du kommer att vara med, och du kommer att göra det. O forex, så att du får mer pengar än du behöver för att få 5 pengar på dig. Podia estar mais satisfeito de tercoberto o mercado forex h alguns anos atrs, tudo porque estava en procurar por maneiras de ganhar dinheiro legtimas e que no fosse preciso ter muito dinheiro para comear J fazia alguns investimentos na bolsa de valores a comprar es mas o forex Ajudou-me a alavancar en minha conta bancria. Saiba quais så att de pratar de gestus de risco que deve de emo de sua de negociao forex Inga listor de trades de insucesso que deram cabo do capital Inv Det finns ingen handel, men det är inte ...