LambdaConf 2015 - Reactive Programming with Algebra   André van Delft
Goedemorgen. Mijn naam is André van Delft. Ik ga over reactieve programma met Algebra. Ik heb met mijn meeste meiën Anatoly Kmetyuk gekregen van Odessa-Ukraine. Maar er was niet een advies in tijd voor de U.S. Anatoly is een student van Law in Odessa. Hij is alleen 20 jaar oud. Ik ben 54 jaar oud en ik ben van Holland. Ik begin met een introductie waarom het programma is stilgevaard. En waarom is het een probleem om te zolven met deze algebrijke approach. Het stemt van het algebrijs van communicatieve procesen. Ik geef een historie over dit. Dan presenteer ik mijn implementatie van deze langingssubscript. Het stelt van Scala en een demo of debugger. En dan kan je ook dataflouden modelen. Zoals voor een Twitter-cliënt en ook een acte programma. Het programma is stilgevaard, want de meeste programma langingssubscript... ...is goed voor het batchprocesen. En idioms die gelukkig zijn, zijn dingen zoals... ...nondeterministische keuze zoals in BNF en in nog steeds een andere compiler. En ook dataflouden zoals in de Unix pipes, in Unix Shell. In functionele langingssubscripten zie je meer en meer support voor die idioms. Ik denk dat het een beetje meer... ...mijn gevolg is het... ...consistente of misschien meer in een uniforme manier. Algebra, we kunnen de nummers beschrijven met algebra en logiek. En als je ook modelprocesen kunt beschrijven. Je kunt denken dat Boolean Algebra extendent met dingen die kunnen gebeuren... ...maar niet alleen truthvalu's. En dan, de oor in Boolean Algebra blijft de oor. Je hebt een keuze tussen procesen... ...maar de eind van Boolean Algebra wordt eind dan. Dus een proces gaat voordat de andere. En deze kant kan je modelen veel dingen. Dus wat is de achtergrond van dit? En wat moet het doen met Lambda calculus? Lambda calculus was created in the 1930s by church and Turing. One of their helpers was Stephen Klaney. En Turing invented this Turing machine. In 1943 was a paper on how the brains work by Pits en McCulloch... ...and that inspired John von Neumann for his CPU model. But it also inspired Klaney to think about the mathematical model... ...for describing how the brain works. And this is a paper by Klaney from 1951. And... ...this is also the basis for... ...formal language theory and automaton. A nice piece here of this paper is these axioms of and and or...  ...but the things that can happen. And this really goes also in this direction of... ...proces algebra that we'll arrive later. Other things that play a role in this history... ...is the work by Chomsky on the natural language grammars. In 1960 had BNF en de eerste compiler-compiler. In 1971 was een Austrian guy Bekic... ...die de algebra van de processen beschrijft. Hij zei dat als twee dingen in parallel gebeuren... ...dat is een keuze waarin de eerste begint... ...en de rest gaat in parallel met de rest... ...of de andere begint eerst met een actie. En dit is waar hij beschrijft... ...parallel compositing in termen van sequenten en keuze... ...en de recursie. Stefan Johnston kreeg nog een compiler-compiler... ...en Harmelman en Campbell... ...de idee om de processen met de path-expressies te beschrijven... ...die we hebben... ...die regularen expressions. En dat geeft Tony Hoer te creëren van CSP... ...en Robert Milder voor CCS en een paar uur later... ...de algebra van communicatieve processen... ...dat namelijk Process Algebra... ...bij Jan Bergstam en Jan Willem Klop in Amsterdam. Milder werkte ook op de functie van de stem... ...en hij bevindt zijn CCS met lambda-calculus... ...en hij bevindt zijn pi-calculus... ...en hij maakt het systeem wat meer expressief. In dezelfde tijd gingen we in de Leiden Universiteit... ...Henck Grumann hetzelfde doen, een beetje verschillend. Ik wil gewoon laten zien... ...de meeste plek van zijn... ...papier, het is een heel klein papier, maar ik denk 4 of 5 pages. Maar hier zie je de soorten expressions... ...dat zijn deorieën lambda-terms... ...alternative composition, parallel composition, sequentie composition, etc. En dan, onder andere pages... ...describeert hoe je kan modelen dingen zoals objecten... ...en registreren, etc. Dus ik would really recommend you to have a look at this paper... ...it's very elegant, but maybe too short... ...it may not explain everything well enough. Maar oké, terug naar deze algebra van communicatieve procesen. Dus je hebt truth-values... ...en sequentie, en choice. Dat zijn de meeste operaties. Maar er zijn ook atomische acties. In de theorieën zijn ze A en B, en zo. En in deze termen kun je express parallelisme en communicatie... ...maar ook andere operaties, zoals disruptie en interruptie... ...en je kan ook tijd, spas en probabiliteiten... ...en ook geld. Er zijn nogal wat publicaties over deze subjecties. Helaas is deze ACP minder als deze andere theorieën CSP en CCS.  Helaas, want ik denk dat het een beetje neer is... ...van de mathematical approach. Het is opgepakt met vervrijdige communicatieparticles... ...productieplans, railways... ...koffiemachines en geldsystemen. De sterkte van ACP is een familieërsyntek. En precies semantiek, je kunt het door termen schrijven. En een heel mooi feature is dat eventen... ...die we als ingang consideren, zijn gewoon acties. Dus er zijn eigenlijk vijf acties in de procesalgebraan. Je hebt deze vijf ook in boeldeenalgebraan. En daar is deze speciaal elementen, 0 en 1. 0 is nu called deadlock, de proces kan niet doen. 1 is called empty process, it's a process that has immediately success. En deze acties zijn in zo'n manier... ...dat je ook een termerwijdsysteem kan gebruiken, van de link naar de link. Dus een exemple van de redenen die je kunt doen met deze... ...is suppose you have a process X plus 1, and then Y. Dus we hebben de proces X of we hebben immuutelijk succes... ...en dan doen we Y. Wat betekent dat? We kunnen deze regeling, de distributie... ...en dan krijgen we X en Y, of 1 en Y. En dan gebruik je de andere regeling hier. Dus het betekent X en Y, of gewoon Y. Dus het adden van 1 maakt het proces optionaal. Je kunt ook parallelismen defineren. En hier zie je de actie, de meeste actie. De twee procesen in parallel, dat betekent dat 1 gaat eerst... ...en dan de rest in parallel, of de andere begint met een actie... ...en dan de rest in parallel, of deze twee procesen... ...starten door te communiceren. En dan zijn de rest van de procesen in parallel. Dus daarom hebben we wat extra actie's voor de auksilieoperatoren. Ik zal de volledige actie's niet geven, maar... ...het interessant is dat... ...we alleen moeten defineren wat deze actie's doen... ...in een aantal cases. De linker kant kan op de vorm van een additie of een multiplicatie... ...waar het start een atomische actie is, of 1 of 0. Dus in deze manier kan je veel meer... ...deze soorten operatoren defineren. Zoals voor disruptie en interruptie. Dit is alleen één approach. Dit is een algebouw. Het bevindt de regels... ...die de procesen moeten obeën. Er zijn ook andere manieren om zo te defineren... ...en er zijn structurele operatoren, operatieve semantische regels. Dus ik ga naar die. Er zijn nu ACP-language-extenties.  De eerste, zelfs voor ACP-langs, was Jan van der Bosch in 1918. Hij maakte de systeem. De input-toolmodel was een extentie naar Pascal en Modula later. Van der Bosch was het geïnspireerd door... ...de path-expansies van Habermann en Campbell. In 1985 begon ik te werken... ...in het team van de Bosch in Leiding University. Toen ik een paar jaar op zijn systeem heb gedeelte... ...maat de brandstof het scriptiek... ...en extentie naar Pascal, Modula, C, C++ en Java. Een andere implementatie, in 1998 en 1994... ...was het Berstein-Klinternam-Standmeid-toolbus. Het was meer op het niveau van het gluien van de operatieve systeem. Een paar jaar geleden ben ik geïnspireerd naar Scala... ...en ik de systeem redesigde en de systeem op de subscriptie. Ik maakte dit voor goeie trollers van de Bosch met het input-toolmodel. Maar ik heb ook tekstparsen, discreet inventsimulation... ...en laagde reactieve systeem, zoals actoren. Laten we een voorbeeld geven van een goeie applicatie. Je hebt hier een simpele search-applicatie met een tekstfiel en een go-button. Als je dan goeie... ...dan mag er een laatste search beginnen. Bijvoorbeeld in een database of op een website. En als dit is gedaan, krijg je de resultaten terug. Typisch hoe je dit programma in Java of Scala in Swing... ...is een programma zoals dit. Het is te technisch, er zijn veel boilerplate-code. Je moet ervoor zorgen dat er dingen gebeuren in de betere threaten. Dus een achtergrondactie moet worden gedaan in een speciaal threat... ...en te laten zien dat het in de goeie moet worden gedaan in de goeie threat. En de switching. Hier is de definitie van het boton. Dit is wat gebeurt als het boton klikt. En daarnaast is dit startstuk gekregen. En dan startt er een threat. En na de threat... ...het is hier modderd door sleep, de laatste actie. En daarnaast moet je er dingen terug in de goeie threaten. Dit is heel slecht. Ik denk dat we dit moeten stoppen. Hoe doen jullie dit met deze procesalgebraat? Je creëert een revijment called a live. En de revijment type is hier, script. Dat is de naam dat ik het geef. De eerste actie is een klik-actie op de search-button. Het is een input-actie, maar dat maakt het niet. Zoals in procesalgebraat, kun je input- en output-tings mixen. Dan in de goeie threat, je zet de tekst... ...en dit add-goeie annotatie hier.  Zeker dat het gaat en dat het een proper threat is. De annotatie is een deel van de langings. Dit goeie ding is een deel van de lab. Dat gaat met het. En we zullen zeker dat de swing-utiliteiten later invoeken... ...en de white method is genoemd. Daarnaast doen we iets in een nieuw threat... ...en je ziet het met de S-risken. En dan gaan we terug naar de goeie threat... ...en printresultaten daar. En we itereren deze drie dotten. Dat betekent wel echt wel. Zoals in Scala, is er een sequentie-composition hier. Je kunt deze gebruiken met semicolons... ...en ook met nieuw lijnen. Maar ook met... ...witte spijs. Maar dan heeft het een hoge prioritie. We zullen dat later zien. Als je zo'n goeie applicatie hebt... ...dan wil je meer botten hebben. En je wilt niet elke keer die klikken. En voor dit is de Scala feature... ...of implicitis is mooi. En met deze feature kan je het ridden van alle klikken. En wanneer de compiler zet, zet er een boton. En het zal deze klikken-rapper voor je installeren. Nu kunnen we dit ook in een verschillende fashion... ...met meer revijmen. Dus we kunnen zeggen... ...dat het een repetitie van search-sequences is... ...en de search-sequences zijn verschillende fase. En we kunnen dit hier op luisteren. Dus effectief hier zien we hetzelfde als in de vorige slide. Nu gaan we zien hoe we dit programma een beetje moeilijker kunnen maken. We willen een alternatieve soorten input hebben. Niet alleen de boton, maar ook de enter-key voor de search. Of we kunnen cancelen met een boton of de escape-key. Of we kunnen exit... ...en gebruiken van een boton of de close box. En dan moeten we het confirmeren, natuurlijk. Zou je dat? We willen alleen deze go-buton hebben... ...omdat de search-textfield niet open is. En we willen ook een progrosindication hebben. Dus hoe gaan we dat programma progroseren? Voor dit, ik probeer... Ik zou het kunnen doen met een live-coding, maar dat is een beetje risico. Ik zal eerst laten zien hoe het programma werkt en dan gaan we het afkoten. Ik hoop dat je hier kunt zien. Dit is... ...on top. Er is de empathy-textfield. De go-buton is disabled en we cancelen ook. Ik typen iets, go-buton is enabled. Ik kan zeggen go hier. En dan de search is ongoing en we hebben wat feedback.  We kunnen cancelen of go. We kunnen cancelen, go en we kunnen pressen exit en we kunnen hier. Confirmation. Meenwaar, de search is ongoing. En we kunnen zeggen, ik weet het zeker niet. En als je kijkt naar dit canceling, dit exit... ...is ook een soort loop in hetzelfde. Het is een loop op de wachting voor het exit-buton... ...en dan de dialoog te spelen, wanneer je niet zeker is. Dus nu ben ik zeker. Laten we hier een live-coding doen. We hebben de search-commands. Het is nu het search-buton. Maar ik kan nu een key-enter aanvoeren. Dit key-enter wordt opgepakt door de compiler. En we doen een andere implicit conversion... ...toch een script die het keypressed is. Met enterkey als parameter. En wat we nu doen, is dat we een button aanvoeren voor een karakter. We gaan niet aanvoeren met procesen. We hebben nu een algebra, niet alleen procesen... ...maar ook een soort van dingen voor een implicit conversion. En ik denk dat het een mooie idee is dat is geïnspireerd door dit SCALA feature. Een idee dat kan ook een theoretische interesse zijn. Nu, de cancel-commands, gelijkbaar. De exit-commands, we hebben de exit-buton en de window-closing-event. Dus we kunnen het zo laten zien. Voor de cancel-search. We moeten naar de main-sequence. We hebben een search-command en dan op de nieuwe lijn. We hebben nu deze cancel-compositie met deze spaces... ...waar ze dichter zijn. En ik kan nu ook de cancel-search hebben. En cancel-search is procedeerd door dit slash. Dat betekent cancelation of disruptie. Zoals je deze cancel-search begint, stopt de rest. Nog een ding. Laten we de exit-proces doen. Dus exit-mand. We beginnen met een exit-command. Dan proberen we in de GUI thread voor de confirmatie-dialog. En de confirmatie-dialog zal resulten in een boel. En we moeten de resultaten in een boel. Voor dit heb ik nu een dataflow-operator available. En de resultaat van de confirmatie-dialog... ...gaat naar de boel van dit wilde ding. Dus dat is de exit-proces. We hebben twee andere feature's. Er is deze guard. Dat we nodig hebben om de go-button te ontdekken... ...waar de textfield niet open is. Ik zal dit... Wat ik hier aanvoer, is een search-guard. Een search-guard is iets dat schijnt door... ...waar de textfield niet open is. Maar het moet revaluëerd worden en de eventen in de textfield gebeuren. Hoe werkt het? Ik moet hier het.  Ja, het is al hier. Dus voor de search-guard, dat is op deze lijn... Wat we doen is testen op de contents van het search-textfield. Als het open is, kunnen we het wegkijken. En er is een notatie voor dit. Er zijn twee dotten, dat betekent een repetitie... ...maar je kunt ook exiten op dit punt. Dus er is een soort van een in hier, in de sequence. Als het textfield niet open is, kunnen we het ook niet uitleggen. Maar we kunnen het er niet uitleggen. Maar we moeten het revaluëerd worden... ...waar er een eventen is. Dus we gaan het hier nemen. Een eventen in de textfield. Dus dat is hoe deze guard werkt. En de laatste ding is deze prograsmonitor. Oh nee, ik vermoed deze exitproces. We moeten het nog steeds activeren. En we kunnen het hier gewoon activeren... ...maar een parallel proces. En dit is niet normaal parallelisme. Normaal parallelisme is op een ampersent. We doen dingen samen. Maar nu heb ik een soort of parallelisme hier. En logisch, de leven van deze applicatie is afgemaakt... ...waar de linker- of de wachtere kant van deze parallel- of operator is klaar. En op de linker- kant hebben we een eternale loop... ...maar het zal nooit klaar zijn. Maar als deze exit is klaar... ...zij gaat op de hoogte en de hele leeftijd is klaar. Dus dan is de prograsmonitor al klaar. En de laatste ding is de prograsmonitor. Ik zal ook hier deze orde-paralysie gebruiken. En om het snel te spelen, zal ik je zien hoe deze prograsmonitor eruit ziet. Dus het is een eternale loop... ...of zoiets in de Gouhi-thread... ...en dan soms een tijdje sleepen. Het is een eternale loop, geen probleem. Want we hebben hier deze orde-paralysie weer. En als de search-actie zichzelf is klaar... ...dan zal de prograsmonitor ook eruit zetten. Dus we hebben hier een combinatie van parallelisme en logisch en tijd. Dat werkt. Dus dat was de live-coding. Misschien is het ook leuk om te zien hoe je... ...de executie van deze kunt visualiseren. Als je deze... Er is een github repository voor deze applicatie. En je kunt het makkelijk maken van deze. Dan wordt er iets zoals Gradle Run of Gradle Debug... ...in je command-lijn. En op Gradle Debug zullen we alles proberen te checken... ...leven de proper jarenfiles. En nu hebben we de debugger.  En ik zal het beter zien. Ik denk hier rondom. Is het zo? Ja. Dus de applicatie is nu aan het starten. En op de link hier... ...we hebben een soort statica... ...abstekstintx-tree van de applicatie. Dat is live. En daaronder heb je deze parallel compositie. En je ziet deze deel-exit en de search-sequences. En op de rechter zie je hoeveel de executie is. En je kunt door deze stappen. Dus deze parallel compositie is activiteerd... ...en op de linkere kant van deze parallel compositie... ...de sequentie-operator is activiteerd. En dan deze loop-contractie. Die zegt dat deze loop-contractie neutraal is. Dat betekent dat in het context van een semicolon of sequentie... ...het succes zal hebben. Het zal de succes opweeg. En de semicolon krijgt de succes van de linkere kant... ...en dan gaat het op met de volgende operatie. En het rijdt een beetje om andere operaties op te doen. En nu, de rechter kant van deze semicolon... ...is activiteerd, etc. En veel van deze operaties bedrijven bijna dezelfde. Er zijn verschillende verschillen. Sommige bedrijven logisch, zoals een eind... ...en andere logisch, zoals een oor. Maar er is veel in de komst. Dat is waarom de implementatie van deze is relatief simpel. Dus we kunnen gaan met dit en automaten. Ik kan hier iets aanbieden en dan zie je hoe dingen gebeuren. Ik moet een beetje aanbieden. Dus er is alle soorten messagingen in deze graf. Succesen en activaties, deactivaties. Ook exclusies. Bijvoorbeeld in deze plus-operator. Als er een atomic actie in een operatie gebeurt... ...dan is de andere operatie helemaal weggevoerd. Dus je kunt de exit doen. Je krijgt de are you sure. De system is in de wacht. Er is geen paul of zo. Er is nu geen CPU-verstand. Totdat ik zei, ja. Dan zal de exit-command gebeuren en het ding stopt. Dus dat is een beetje hoe het werkt op een hoge niveau. We moeten naar deze. We hebben deze schrijven en deze zijn revijmen. Ze veranderen het in javiescala-methoden. Ze zijn invoet van scala met een executor. De default executor is een beetje terministisch... ...maar je kunt ook in principe een meer probabilistisch executor hebben. In de procesalgebraat kunnen twee procesen communiceren. De resultaten kunnen twee atomic actions communiceren. De resultaten zijn een andere atomic action. Het lijkt me handig om twee schrijven te communiceren... ...en de resultaten zijn een andere schrijf.  Niet alleen een atomic action, maar iets meer generaler. Het is ook mogelijk om drie of meer partners in communicatie te hebben. In een manier kan je ook zeggen... ...dat een singelpartner ook communicatie is. Het is een script call. Het is een communicatie met alleen één partner. Dit is een communicatie hier. Het is een generalisatie van een call-mechanisme. Je hebt een call-e en een of meer coloren op dezelfde tijd. Je kunt deze bijvoorbeeld op een singelheid senden... ...en de senden en de regeving processen. De implementatie... Dit is een beetje oud, ik denk dat we nu... ...we hebben... ...de syntax-support in de Scala compiler gegeven. Dit is een beetje een beetje een messie. We zijn nu alweer met een versie... ...dat doet de syntax in de parboil. Dan generen we Scala code. Dat is in de Scala compiler gegeven. En een aantal macros doen wat typische checkings. Als je een simple script hebt... ...dan is het vooral wat de eerste fase doet... ...om een soort sterkte waar je similaar elementen... ...zoals sequentie en alternatieve compositingen en zo. Dus het is niet echt een grote deal wat er hier gebeurt. In principe heb je deze speciaal syntax niet echt nodig. Ik denk dat het gewoon meer mooi ziet dan... ...de versie met meer parenthesis en braces. Er is ook deze VM, die speelt van al deze vliegen... ...maar deze dynamische call-graf. Om al die swing-eventen te handelen, is er een module. En deze debugger is ook niet... ...maar 550 lijnen. En de controler van deze debugger is ook... ...een subscript. Met zijn eigen VM dan. Dus dit zijn de scripten die de GUI van de debugger controleren. En twee jaar geleden heb ik deze aan de Scala team op de EPSL. En dan heb ik deze exitproces... ...en hier in een beetje verschillende versie met een lokale variable... ...dat hadden gezet en zo. En het was niet echt goed. En na Chef K.Bermarco zei me... ...get rid van de vars. Dus dat maakte mij denken. En dat is waarom ik met deze alternatieve versie met dataflow kwam. En voor deze moet je ook lambda's nodig hebben. Want de operatoren van zo'n dataflow-arrow... ...de rechterkant is in principe lambda. En hier zie je een simpele arrow. En op de rechterkant zie je deze r-arrow, die is Scala idiom. Dan zie je een reale subscript-syntekst.  Deze square brackets, dat betekent dat we nu een scriptproces binnenkomen. Dus dit is een Scala function die begint met een boelje... ...en een proces geeft dat een iterator is voor deze scripten. Een andere way to write this down... ...is to get rid of these square brackets... ...I found this syntax with a little bit longer arrow. You could also just get rid of this r and use this Scala idiom with an underscore. This does not work at the moment. En een ander ding is om deze parameter r in deze arrow te doen. Wat moet je voor deze doen? De scripts hebben resultaten nodig. Methoden hebben hun return-valu's. Je moet ze kunnen ontdekleren. Je moet iets doen met deze. De resultaten zijn gepakt in een trie, want dingen kunnen overhouden. En dan wil je een acceptie hebben. Het is een beetje zoals wat je doet in futures. En soms heb je... ...mulkele operaties die een resultaat kunnen hebben... ...en je wilt selecten die operaties zijn gebruikt. En voor nu hebben we deze annotatie met deze carat-symbolen. Maar dit is wel nieuw. We denken nog steeds over hoe we het doen. We kijken ook naar wat parboil doet. En ik denk dat ik echt de kracht van parboil vind. De dataflow is met deze arrow, maar je kunt ook een acceptie hebben. Dus als de linkerzijde klinkt... ...en we als een 0 in failure... ...dan kunnen we de acceptie hebben aan de volgende ding. Of we kunnen deze turnaire gebruik hebben van een dataflow-construct. Dus we beginnen met X. Als er dingen ergens is, gaat de resultaat naar Y. Of als er iets ergens is, dan past de acceptie op 2z. En we kunnen ook informatie in deze arroes... ...en dit is een soort syntactische suger om de typische scala... ...en de partie van de functies die de dingen aan de rechter kant van de arrow handelen. En het is een relatief klein transformatie dat de compiler hier doet. Dus alles wat je kunt zien in scala acceptie-handeling... ...of in de partie van de functies, kan je ook hier doen. Een ander... Het is gewoon een ander voorbeeld voor dit dataflow. Het is een slik-3-code die ik vorige week vond voor het redden. Dus we hebben hier een slik-querie. En je krijgt de resultaat van deze query en dan moet je zeggen...  ...of je bent klaar om de resultaat van deze query te krijgen. En dan zeg je, let's maken een toekomst om dit op het database te doen. En dan zeg je, wat zou gebeuren op het succes van deze toekomst... ...die je de resultaat zal printen. In principe kunnen we dit proberen, dus we hebben dezelfde query... ...en met deze dataflow-operator... ...we kunnen laten de resultaat van deze query-flow... ...immediate naar het printstakel. We hebben alleen een implicit conversie... ...die hetzelfde als je ziet bovenaan. Maar dit is waar je met veel boilerplate-code kan krijgen. Dus je moet niet echt alle dingen schrijven als je een nieuwe query schrijft. Als je alleen één query hebt in het programma, dan is het niet zoveel. Maar ik denk dat het goed is om je programma te maken. Een ander voorbeeld. Ik zou willen demonstreren, ja, ik heb nog tijd. Ik ben een Twitter-search-klaas. En ik was geïnspireerd met dit... ...bij dit reactief programma-kors. Of een korshever, misschien heb ik dit gedaan. En je hebt deze... ...example met een gooie... ...gezend door Eric Meyer. Ik heb eigenlijk niet echt deze sleutel van de toekomst... ...omdat de code... ...ik vind het moeilijk om te readen. Wat doet dit Twitter-example? Doe het precies. Je kunt een search-klaas enteren... ...en in het principale, je gaat op Twitter searchen... ...waarom de search-klaas veranderen. Maar je wilt dat niet te vaak doen. Want als je te vaak doet, dan zal Twitter zeggen, stop je... ...en je vraagt naar March en dan moet je een paar minuten wachten. Dus wat we doen is... ...waarom de content van deze tekstvoel veranderen... ...waarom wachten een paar honderd miljoen seconden... ...en alleen dan, wanneer we niet begonnen te typen... ...halen we de request naar Twitter. Dus de typische manier om dit te doen met deze... ...futures... ...of we zouden zo zijn. We zouden een soort interruptabel futures hebben. En ik wil niet in de details van deze code... ...maar persoonlijk vind ik al deze... ...braces enzovoorts... ...en ik krijg een beetje los in de controlervloer... ...en ik weet niet waarom ik hier moet wachten... ...flatmap en ernaar, complet enzovoorts. Of ik weet het niet, maar ik wil het niet weten. Logisch is er een flow van de top tot de bottom. Het is een verkeerde leiding, maar... ...ik doe het meer vaak.  Dus hoe doen we het met deze algebraiek appartement? We hebben een livescript, waarin we het eerst initialiseren... ...en dan hebben we veel searchers. En de search is een sequence die zich interrupt of disrupt. Dus de search sequence begint met iedere event in de search field. Dan rijdt je een beetje en doe de search in de achtergrond. En in het meantime, als een andere character is... ...of je rijdt, dan zie je een soort iteration. En de volgende instance van deze main-sequence... ...die de periode is. Maar de resultaten... ...waar de search is gedaan in de achtergrond... ...dan zijn de resultaten geïnteresseerd in de GUI. Of als er iets ergens was, dan krijg je een error-message. En hier doe ik deze search in de separate threads. Of je het niet leuk vindt, of je wilt een andere mechanism met threadpools of zo. Of je kunt in principe de threads hier verplaatsen... ...aan de futures die je hebt gezien in de vorige exemple. En dan krijg je deze. Je hebt hier de interruptive futures. Je maakt ze hier, met rijd en search. En nu heb je deze implicit conversions... ...van de futures naar de scripts. Dus, als je een mooie future ervaring is voor iets... ...dan kan je het resultaat van deze... ...en procesen, zoals dit hier, met een dataflow-operator. En een implicit conversion zou zo zien als dit. Ik ga niet naar de details. Er is wat werk hier echt gedaan in deze method. En... ...het is een heel technische code. Maar hier onder de rijd zie je iets peculiarer. Het is een soort atomische actie, maar de dots zeggen... ...dat het iets anders moet worden bezoekt. En dat is wat de annotatie doet. De annotatie zegt dat als de futures klaar is... ...dan is dit stuk van code hier. Daar zal het executed zijn en misschien zal het succeden. En deze manier kan je met deze constructie... ...kommeren met alle inputacties met normaal acties. Ik denk dat het ook mogelijk is om de andere rijdkant te converteren... ...en scripts naar futures. Maar er is ook een bepaalde mismaat. Deze futures zijn niet goed... ...normaal is het hard om te cancelen. Dus, als je gaat... ...en deze futures hebben ze geen optionale succes... ...als je met deze processen kan met een toerproces. Dus er is een impendent mismaat, maar je kunt er in principe een combinatie doen.  Een ander ding dat ik wil laten zien is hoe het verbindt met acties. Een van de problemen die ik zie met acties is dat de internaal behaal van acties... ...is redelijk heel hard om te programmen. Vooral als je futures moet gebruiken of zo, of er iets in parallel is. Bijvoorbeeld gaan er andere acties. Laten we zien hoe je het kunt doen. Een simpele voorbeeld is een ping-pong systeem. Een ping-actor sendt een hallo, hallo en terminaal naar de andere actie. In de andere actie kan je een lift script maken voor dit. En dit is een soort van vergeten ding in deze actie. Hier wil je een hallo vergeten, in een infinitieve deel in een sequentie. Maar in parallel kunnen we ook termineren. En het is oor-paralysme dan de totale eind. Ik zou hier ook een slag hebben. In dit geval is het niet zoveel. Je kunt ook een implicit convergenie hebben en dan begint het te zien... ...maar een langssysteem. Een ander voorbeeld, wat niet echt een goede systeem is. Het is een data store met een proxy en een server. Een client kan een informatie senden. De proxy zal het aan de store senden, het zal data senden... ...en de proxy zal een details-request senden based op deze eind. En het gaat terug naar de store en de details terug en dat gaat naar de client. Het hartstikke is om de behavior van deze proxy te beschrijven. In het typisch eca-ideum... Ik denk dat we iets doen met deze state-machines. Je krijgt drie states voor request en voor data en details. Ik denk dat het een mooie idiom is, maar het ziet ook een beetje als go-to programming. En go-to is nu namelijk become. Ik denk dat dit ook te lang is. Een manier om dit in de subscriptie te doen is zoals dit. We kunnen de handelers van deze message-handelers nesten. Dat geeft meer moeilijk. Dat geeft meer moeilijk aan de programmer. Maar het nesten in general maakt het moeilijk. Ik bedoel niet perenties. En hier zijn de perenties ook perenties. Ik ga niet uitleggen hoe dit werkt, want we hebben een betere solution. Dat is met dataflouw. We krijgen de informatie request in de recievenmethode van de acteur. Wat doen we? We krijgen de script die begint van deze aero. Er zijn een aantal lijn, verder op.  We senden de request op naar de datastore. Maar we doen het met deze question markt. De question markt een future dat op de data stage... ...de reply van deze datastore geeft. Dan moeten we hier een implicit conversion in scope. Dat bevindt de resultaat van de toekomst. En... ...sendens de resultaat op de datastore. Het bevindt deze data. Het geeft de details request en sendt dat op de datastore. En we krijgen de toekomst en op de datastore... ...we krijgen de details back from the datastore... ...en dan senden we de details. De syntax voor dit... Dit is werk in probleem. Het is niet enthoudig hoe we... We moeten de resultaten pakken... ...en gebruiken van deze implicit conversion. Het is een beetje werk in probleem, maar ik denk dat... ...we kunnen modellen deze actuele beperking beter dan... ...het nu vaak gedaan. Vooral was ik persoonlijk vergeten... ...bij deze laatste alastazement... ...in de reactieve programma-cours twee jaar geleden. Ik vind het heel hard en dat is één reden... ...om het te vergelijden met rewriting van dingen... ...in deze procesalgebraat. Ik denk dat dit een beetje een idiom is. Als je niet op een programma-cours twee maakt... ...en je niet wilt hebben een andere compiler of zo... ...dan schrijf je deze op een schilderpapier... ...in dit stijl, dat kan helpen met wat de acteur doet. Er is een implementatie. Ik wil de code in te veel details... ...maar acteur geeft mooie hoeken om in het systeem te draaien. Het is niet zoveel gedaan, maar wat de compiler doet... ...is dat als je hier een soort expressie hebt... ...met zo'n message en wat het doet... ...dat creëert een code... ...in een method in een subscriptacteur... ...maar een subclass van een normaal acteur. De transformatie is niet heel groot... ...en hier is de informatie van deze method... ...maar het is te technisch, maar het is niet te complex. Ik heb nog een paar minuten gehad. Waar zijn we nu in het spas van langsparadijmen? Laten we beginnen met imperative langs, zoals assemblies en zee. Je kunt lampdans eten. Dan kan je typisch dingen zoals Haskell en Lisp. Je kunt ook objecten eten. Je kunt op C++ of Java eten. Smalltalk, Scala en Java 8 eten. Of je kunt in een andere richting gaan, zoals de declaratieve stijl... ...als je in Prolog en Jack hebt.  Je kunt ook de command shell met deze pipeline-operator eten. Als je objecten eten, dan krijg je Java CC, de Java-compareter-compareter. Als je het doet met alles, dan krijg je het subscriptacteur... ...maar ook in een aparte wereld, en misschien ook een paar andere dingen. Misschien ook deze streams die je nu krijgt met Scala en zee. Dat is waar we zijn in het langsparadijmen. Conclusie. Ik denk dat je deze manier efficiënt kunt programmeren. De executie is een beetje minder efficiënt. De system van een computer... ...gaat 10.000 acties per seconde, misschien 30.000. Als we optimiseren, kunnen we tot 100.000, maar niet meer. Als je dat comparet met acties, dan handelen er een miljoen message per seconde. Dus we lopen het achter en kunnen het niet opmaken. Dus je kunt het alleen gebruiken, maar voor Goeie... ...is dit vaak genoeg. De implementatie, dus we werken... We hebben de Scala brains. We zijn ongeveer... Ik denk dat we ongeveer half-way naar een aparte wereld. Anatoly in Odessa doet dit. Het is een open-source project. Hier is de website en de GitHub. En er is nog veel te doen. Wat we willen doen, is om naar de JavaScript-site... ...maar om deze dingen te werken in de browser. Om te kijken met Scala.js. En misschien niet alleen in de browser, maar we willen ook zien... ...waar we iets kunnen doen in het gebouw van Node.js. Ik weet niet of we iets kunnen proberen, maar het is leuk om het uit te vinden. Een ander ding om te doen is deze ACP-style communicatie. Dat heeft een beetje een hoge prioriteit. We hebben de rest helemaal stabiliseerd. Er is ook veel te ontdekken op een meer theoretische basis. Ik heb ongeveer 10 toppies op een papier... ...dat ik op argrif.org heb gestorven. Het is een beetje een weird project. Ik heb al 10 jaar bezig met dit. In de laatste paar jaar heb ik een beetje succes gegeten... ...dat ik op conferenties kan spelen. Dit is de eerste keer dat ik op dit site van de Atlantica Oceaan ga spelen. Ik ben heel gratis om John te geven me deze kans. Ik ben meer gelukkig op de andere kant. Ik ben op Scala Days, Scala Worship, Scala Exchange... ...last december, alsof LAMPDAD Days, last February in Krakow. Maar ik wil nogal wat feest dat ik heb voor dit project... 