En vecka med Gleam
Om funktionskompensation, mönstermatchning och rekursion
Under en dryg vecka har jag labbat med språket Gleam som en del av mina 'Advent Of Code'-övningar. Att jag valt just det språket är en kombination av flera faktorer, men framförallt drivet av nyfikenhet. Jag har inte behövt använda alla delar av språket, men låt mig demonstrera några av dess mest fundamentala delar och det som ger språket sin karaktär.
Orden i underrubriken är inget som är nytt för utvecklare i funktionella skolan, men det som kanske skiljer Gleam från många andra språk är hur centrala dessa tre koncept är. I många språk så finns det många olika sätt att göra saker och man har flera gångbara alternativ av syntax och ganska kraftfulla språkstöd. Gleam känns väldigt avskalat i jämförelse.
Syntaktiskt liknar det C, Go, Rust osv en del. Men när man skriver i det så känns det nästan närmare ML-språk så som Haskell, OCaml med flera. Dock inte alls lika kraftfullt, men sättet der lutar sig mot mönstermatchning och rekursion ger det en viss stil.
Funktionskompositionen stödjer några vanliga mönster från språk av den här skolan, men har inte samma flexibilitet som några andra språk har. Man kan göra pipelines, lambda-uttryck och pipe-operatorn matar in returen från föregående funktion som första argument in i nästa. Tar funktionen bara ett argument behövs inga parenteser.

Om parametern inte kan skickas in som första argument så försöker den appliceras på returen av funktionen istället. Genom att stoppa in parametrar, även namngivna och att använda platshållare så kan man styra vart den pipeade datan hamnar.

Det finns inga if-satser/uttryck, man gör mönstermatchning, det finns inga loopar (for, while osv), utan man måste applicera funktioner på samlingar, "mappning", eller använda rekursion. Rekursion brukar vara en mer exotisk funktionalitet i många andra språk, men här är det centralt och språket har stöd för optimerad svansrekursion, vilket gör att det inte fyller stackminne vid när den kedjar funktionsanrop. Inte något som är unikt, men givet att det ersätter många andra kontrollflöden så känns det som en väldigt integral del.

Det här skrapar bara på ytan av språket. Det finns en del att prata om kring typer och annat. Men väldigt mycket kokar ner till återanvändning av små enkla koncept som känns bekanta för funktionella programmerare, men som också borde vara lätta att ta till för utvecklare i imperativa språk givet att syntaxen är så fattig (med flit) och att inga koncept känns främmande. Kommer man som jag från ML-skolan av språk så saknar man vissa mer avancerade konstruktioner som skulle öka ergonomin och göra det mer uttrycksfullt. Men det är också väldigt lätt att respektera de val som gjorts och enkelt att förstå vinsten i att hålla saker enkelt.
Ta gärna en titt du med! https://tour.gleam.run/
Johan Burell är senior systemarkitekt och utvecklare på Mint, med ett starkt fokus på funktionell programmering, kvalitet i kod och ständig utveckling av det egna hantverket. Han rör sig obehindrat mellan teori och praktik och är känd för att gärna utforska nya språk, paradigmer och sätt att tänka - inte för att det står på kravlistan, utan för att nyfikenhet är en stark drivkraft.
