fredag 16. desember 2011 Julekalender Polyglot WTF Esoteriske språk Betterave
Betterave er et såkalt esoterisk programmeringsspråk, sånn som Unlambda som jeg snakket om i luke 8, eller Brainf*ck som jeg skrev om tidligere i år. Men slapp av, det er ikke like grufullt som dem. Selv om Betterave ved første øyekast ser helt uforståelig ut, er det egentlig ganske enkelt. Så her har du et språk det er en stor sjangse for at du kan lære deg, og bruke til å imponere dine nerdevenner ;)
Betterave består av funksjonsuttrykk på samme måte som Lisp/Scheme. Språket har en prefix-notasjon, men ulikt Lisp slipper man alle parantesene – hver funksjon "vet selv" hvor mange parametre det har. Dermed kan man også trekke paralleller til Rebol, som egentlig fungerer på samme måte.
Og da skal du få se ditt første Betterave-program. Igjen finner jeg summen av alle tall under 1000 som er multipler av 3 eller 5. Siden ingen funksjoner i Betterave er lengre enn én bokstav får hele programmet fint plass på én linje:
1 L-***83679N0S0[N+n1T+=0%n3=0%n5?>t0S+sn!|<nl].s
Enkelt, ikke sant? Du skjønte dette?
Som sagt, det er ikke så vanskelig som det ser ut – og å lære det er ganske givende. Mere givende enn å spille minesveiper eller soduku i alle fall, så da er det verdt tiden til de fleste av oss.
Selv om programmet kan skrives på én linje, så må det ikke det. Ved å bryte det litt opp og legge på noen kommentarer tror jeg det skal være ganske enkelt å forstå hvordan det virker. Men du må vite et par ting først...
Det er ikke mulig å uttrykke tall som er større enn 9 i Betterave direkte. Når vi skriver 9 i koden er det egentlig en parameterløs funksjon som returnerer tallet 9, og siden ingen funksjoner kan bestå av mer enn ett tegn finnes det ingen 10-funksjon. Så hvordan lager jeg da for eksempel tallet 999, som jeg trenger for å løse oppgaven min?
Jo, jeg må regne litt! 8 ganger 3 er lik 24. I Betterave skrives det som *83. Altså funskjonskallet * (stjerne/multipliser) som tar to argumenter: resultatet av funksjonen 8 og resultatet av funksjonen 3.
Videre er 24 ganger 6 lik 144. Dette kan jeg nå uttrykke som **836. Og ganger jeg dette med 7, og trekker fra 9, så står jeg igjen med 999. Funksjonsuttrykket blir da –***83679.
I Betterave har programmene tilgang til å bruke 27 variabler, en for hver bokstav i det engelske alfabetet. Stor bokstav, for eksempel A, er en funksjon som tar ett argument og lagrer argumentet som verdi i variabelen. Liten bokstav, for eksempel a, er en funksjon uten parametre, som returnerer verdien i variabelen.
Nå har du lært nesten alle tingene jeg har brukt i programmet du så i starten. Det eneste som manger er muligheter for å ta avgjørelser og å lage løkker.
Jeg har brukt to strukturer for programflyt i programmet mitt. Den første er [ xxx | yyy ]. Den fungerer sånn at hvis yyy er noe annet enn verdien 0, så hopper programmet tilbake til startklammen – altså [. Det er altså en veldig enkel do-while løkke.
Den andre strukturen er ? xxx yyy !. Denne fungerer sånn at hvis verdien av xxx er 0 så vil programmet hoppe til utropstegnet, og altså ikke evaluere yyy. Dette er altså en enkel if-setning.
Hvis du har fulgt med skal du nå være i stand til å forstå det hele:
10 L -***83679 ~ storing 999 in L (limit) ~ 11 N 0 ~ setting N to 0 ~ 12 S 0 ~ setting S (sum) to 0 ~ 13 14 [ ~ loop ~ 15 N +n1 ~ increment N ~ 16 17 ~ set T to the sum of the modulo tests ~ 18 T + =0%n3 =0%n5 19 20 ? >t0 ~ if T is larger than 0 ~ 21 S+sn ~ add N to S (sum) ~ 22 ! ~ end if ~ 23 | 24 <nl ~ while N is less than L (limit)~ 25 ] ~ end loop ~ 26 27 .s ~ print value of S ~
Jeg sa jo at det var enkelt!
Du skal bruke tid på Betterave og andre esoteriske programmeringsspråk fordi det gjør at du må tenke. Dette er rett og slett problemløsning hvor du tvinges til å sette deg inn i et sett med regler, og hvor du må finne ut hvordan du får systemet disse reglene representerer til å gjøre noe for deg. Dette stimulerer deg og gir deg ferdigheter du som en utvikler behøver.
Dessuten er det gøy!!!
All informasjon du behøver om Betterave finner du på esolangs.org. Denne wikien er også en god kilde til andre, lignende språk du kan forsøke deg på.
Selve tolkeren til Betterave er skrevet i Ruby, og er ikke mange linjene. Jeg måtte modifisere den litt for at den skulle virke slik som jeg ønsket (dvs. at den kunne ta en betterave-fil som et argument og så kjøre denne), og min versjon finner du her. Har du Ruby installert allerede er det bare å lagre ned koden, og så kan du kjøre betterave-filer ved å sende dem til tolkeren i kommandolinjen din.