- Hva er funksjonell programmering?
- Det er det vel ikke så stor enighet om.
Her kunne ukas episode av podcasten kode24-timen, med Kodemaker-utviklerne og Clojure-entusiastene Christian Johansen og Magnar Sveen, slutta.
Men vi ga oss ikke.
For vi, og medlemmene av kode24-klubben, har rundt regna tusen millioner spørsmål om funksjonell programmering generelt, og språkene Clojure og ClojureScript spesielt.
Derfor inviterte vi dem inn i studio, og resultatet hører du i kode24-timen under. Under der igjen får du svar på noen av de viktigste spørsmålene i kortversjon!
#1: Hva er funksjonell programmering?
- Det er det vel ikke så stor enighet om, begynner altså Magnar Sveen.
Dette er nemlig et større og vanskeligere spørsmål enn man liker å tro.
- Det jeg tror folk flest tenker på, er at man bruker mye høyere orden-funksjoner, som for eksempel map, filter og reduce i JavaScript, i stedet for løkker og imperativ programmering, sier Sveen.
- Det er den korteste veien inn til funksjonell programmering for de fleste. Også har du blant annet også typen for eksempel Elm pusher, som er statisk typet, med sterke typer i Haskell-stil, hvor du må modellere domene ditt veldig grundig.
Clojure, som Sveen og Johansen bruker mest, er dynamisk typet. Også handler det mye om immutable data som ikke forandrer seg, men heller blir returnert fra funksjoner som ny data, og altså bruken av "rene" funksjoner - funksjoner språket selv gir deg. Vi hadde en lang prat med Sveen og Johansen om alt dette for et år siden, så sjekk gjerne ut den artikkelen også.
Hva er egentlig greia med funksjonell programmering? 🤔
#2: Om vi skulle laga et spill, hadde vi hatt et spiller-objekt med poeng og liv. Men hvordan ville dere løst det funksjonelt?
- Jeg ville også modellert spilleren, men skilt på nåtilstand og tilstanden du snart skal ha. Man kan representere tilstanden til spilleren som en immutable datastruktur, og går spilleren ett skritt fram, blir det da en ny datastruktur, forklarer Christian Johansen.
- Og om man vil gi spilleren et poeng, sender man den bare inn i en giMerPoeng-funksjon?
- Ja, også kommer det en ny spiller ut. Under panseret får du da en datastruktur som for det meste peker på det samme som den gamle, men med en ny poengsum.
- Og hva er vitsen med det?
- Det gir endel garantier. Når man vet at man har immutable data inn i funksjonen vet man at den du sendte fra deg ikke kommer til å ta skade av det. Og vil du for eksempel ha en angre-funksjon i spillet ditt, er det bare å ta vare på den gamle spilleren.
#3: Dere bruker for det meste Clojure og ClojureScript. Hva er forskjellen på de to?
- Det er det samme språket, men med to forskjellige kompilatorer. Clojure kompilerer til Java bytecode, mens ClojureScript kompilerer til JavaScript, på samme måte som for eksempel TypeScript, forklarer Sveen.
Begge språkene kan derfor brukes sammen med de to "moderspråkene"; Java og JavaScript.
API-er, rammeverk og biblioteker du bruker med Java og JavaScript kan dermed også brukes med Clojure og ClojureScript, ofte i egne versjoner for de to, som Reagent for React i ClojureScript.
- React er på en måte killer app-en til ClojureScript, for den passer så godt til modellen. React har på en måte funksjonell tilnærming til noe som ikke er funksjonelt, sier Johansen.
Og bare så det er sagt: Du kan i prinsippet programmere funksjonelt i alle språk. Poenget med språk som Clojure er å gjøre det enklere.
#4: Hvor burde man starte for å lære seg Clojure og ClojureScript?
- Det er stadig et tema, smiler Sveen.
De to har programmert i språkene så lenge at det er litt vrient å svare på, men de anbefaler blant annet:
- Boka Web Development with Clojure, Third Edition
- Video-guidene på purelyfunctional.tv
- Sveen og Johansens egen serie på zombieclj.no, som ikke nødvendigvis er nybegynnerstoff, men i det minste inspirasjonsstoff
I år skal Kodemaker prøve Elixir og Erlang
#5: kode24-klubben spør: "Finnes det noen problemtyper hvor funksjonell programmering er en spesielt dårlig match?"
- Vi prøvde å gjøre bildebehandling en gang. Det tok minutter i stedet for millisekunder, smiler Sveen.
Det handler om at ting som skjer på GPU-en ikke skal være spesielt godt egnet til funksjonell programmering.
- Så å lage spill med Clojure er ikke optimalt?
- Vi lager spill til høyre og venstre vi, som Zombie-spillet og Adventur Delux, men ikke selve rendering-biten, nei.
#6: En ungomdomsskole-lærer på kode24-klubben spør: "Hva er det absolutt enkleste ferdige prosjektet dere kan tenke dere med funksjonell programmering, gjerne beregnet til å bruke i en undervisningssituasjon?"
- Jeg har faktisk gjort det: Hatt time for klassen til datteren min. Og da koda vi litt, i Clojure såklart, for det er jo så lett å forstå, gliser Sveen.
- En ting jeg gjorde var å lage adjektivhistorie. Da gjorde jeg noen replace på hvor jeg prompta for adjektiv, også ropte jeg ut i klassen for å få demm og leste den opp etterpå. Det var veldig gøy. Hvor mye de lærte om programmering er jeg litt usikker på, men det var i alle fall en morsom øvelse som var to linjer med kode.
«Hvor mye de lærte om programmering er jeg litt usikker på.»
- Og når du sier to linjer kode, da mener du faktisk to linjer kode?
- Ja, helt konkret to linjer kode.
- Vi har hatt kurs hvor vi laga Mastermind, og Yatzee har jeg laga en haug ganger, skyter Johansen inn.
- Og alt dette kan du få opp på noen få skoletimer, om du har CSS-en klar.
Fortsatt litt usikker på hva greia med Clojure og funksjonell programmering er? Hør på hele ukas episode av kode24-timen, så blir du klokere! Og under ser du deres Yatzee i Clojure, så får du et inntrykk av hvordan det ser ut i praksis:
.
- Dette spillet er mitt livsverk
Magnar Sveen har brukt over 20 år på å skrive over 30.000 sider med innhold til Adventur Delux i Clojure.