torsdag 1. desember 2011 Julekalender Polyglot Lua
Nå skal du få møte et søtt, lite programmeringsspråk som sitter inne i andre programmer og drar i de viktige trådene for å få ting til å skje. Si hei til Lua!
Første versjon dukket opp i 1993, og hentet inspirasjon fra mange forskjellige kilder som C++, CLU, Modula, Scheme og SNOBOL. Lua er skreddersydd for å embeddes i andre programmer. Derfor er det lite og enkelt, men samtidig også både kraftig og raskt.
Lua er også robust, og har bevist at det holder mål på mange forskjellige plattformer og til ulike formål. Blant annet er Lua det mest bruke scriptspråket i spill-verden. For eksempel finner du Lua i SimCity, World of Warcraft, Adobe Photoshop Lightroom, Wireshark, Squeezebox Jive Platform, MySQL Proxy, LEGO Mindstorm, PlayStation Home, teksteditoren SciTE, og i Kennedy Space Center sitt Space Shuttle Hazardous Gas Detection System.
Som veldig mange av språkene som har blitt laget de senere årene er Lua multi-paradigmisk. Det er dynamisk typet, og støtter både imperativ programmering og funksjonell programmering. Lua støtter også prototypebasert objektorientering ala. JavaScript og Io.
Semantisk er språket faktisk veldig likt Scheme (en Lisp), men syntaksen er ganske anderledes og mye enklere og greiere å lære for dem som er vandt til mere populære/vanlige språk som C++, Java, Ruby o.l.
Lua forsøker å være kraftig og anvendelig samtidig som det skal ha et lite footprint og være ekstremt raskt. Designerne har derfor valgt å skreller bort mange egenskaper man er vandt til å finne i andre språk, men som man som regel kan klare seg uten.
Blant annet vil du oppdage at Lua kun har noen få datatyper. I bunn finner du boolean, tall, og strenger. I tillegg har lua en datastruktur som heter Table. Dette er rett og slett et assosiativt array (eller map, eller dictionary – avhengig av hvor du kommer fra), og brukes til alt. Der hvor du normalt ville hatt et vanlig array, et sett, en liste, eller en record-type bruker du Table i Lua. Du bruker det også til å lage objekter.
Som jeg har forberedt dere på har jeg implementert en løsning på Euler problem #1 – hvordan man summerer opp alle tall under 1000 som er multipler av 3 eller 5. Først lager jeg en liten funksjon som bruker modulo til å sjekke om x er delelig på y:
3 function multiple_of(x,y) 4 return x % y == 0 5 end
Som du ser er syntaksen enkel og grei. Lua er dynamisk, så jeg spesifiserer ingen typer. Merk at jeg heller ikke behøver å avslutte linjer med semikolon, som enkelte er veldig vandt til å gjøre.
Deretter kan jeg lage en funskjon som sjekker om et tall er delelig på enten 3 eller 5:
7 function multiple_of_3_or_5(i) 8 return multiple_of(i,3) or multiple_of(i,5) 9 end
Lua skal ifølge ryktene være greit å bruke for ikke-utviklere også, så her bruker vi or og ikke ||.
Den neste funksjonen illustrerer at man kan sende funksjoner inn som parametre til andre funksjoner. filter_and_sum_range gjør akkurat det navnet sier:
11 function filter_and_sum_range(start, maximum, filter) 12 -- warning: skipping "local" would create global variable 13 local sum = 0 14 for i=start,maximum do 15 if filter(i) then 16 sum = sum + i 17 end 18 end 19 return sum 20 end
Legg merke til at for-løkke-syntaksen ikke er hentet fra C, men i stedet er kompakt og enkel. Merk også det jeg sier i kommentaren på linje 12 – hvis man ikke sier local forran variabeldeklerasjoner opprettes de i det globale navnerommet (scope). Dette synes jeg høres veldig skummelt ut..
Til slutt viser jeg i en one-liner hvordan jeg bruker funksjonene mine til å finne løsningen på oppgaven:
22 print(filter_and_sum_range(0, 999, multiple_of_3_or_5))
Man kan også opprette anonyme funksjoner i Lua. La oss f.eks. si at jeg ikke hadde opprettet funksjonen multiple_of_3_or_5. Da kunne jeg i stedet funnet løsningen ved å gjøre følgende:
25 print(filter_and_sum_range(0, 999, 26 function (i) 27 return multiple_of(i,3) or multiple_of(i,5) 28 end))
Her oppretter jeg altså en anonym funksjon direkte i funksjonskallet hvor jeg skal filtrere og summere. Ikke helt ulikt hvordan JavaScript ofte brukes og ser ut dette her.
For det første kan det tenkes du faktisk har et reelt behov for å lære Lua – fordi du trenger å skripte et av programmene eller spillene som bruker Lua til dette formålet. Som utvikler er det dessuten interessant å kunne embedded språket i sine egne programmer eller systemer. Det finnes selvsagt mange andre språk som kan brukes på denne måten i dag, men få som er så til de grader optimalisert for det.
Personlig synes jeg Lua også er et ganske interessant språk i seg selv. Man kan lære et og annet av enkelheten man finner her. Dessuten er språket svært fleksibelt, så man kan bruke det på mange ulike måter.
Du finner det meste du trenger på lua.org. Bruker du Windows som meg anbefaler jeg at du laster ned Lua for Windows, som er en pakke med "batteries included". Her får du selve Lua, samt en rekke bibloteker, et SciTE-basert utviklingsmiljø (IDE/editor), og en rekke kodeeksempler.
Du finner også en masse eksempler og tutorials online her på Lua's wiki.
For å begynne å lære anbefaler jeg rett og slett at du leser Lua 5.1 Reference Manual – Lua er et lite språk, og det går raskt å konsumere alt sammen. Deretter er det bare å begynne å kode!