Euphoria


lørdag 3. desember 2011 Julekalender Polyglot Euphoria

Euphoria er et akronym for noe så spesielt som End-User Programming with Hierarchical Objects for Robust Interpreted Applications. Dette prosedyrebaserte språket ble orginalt utviklet for Atari, og første release kom i 1993. I 2006 ble det open source, og i dag er det et språk som kan kjøre på Windows, Linux, FreeBSD og OS X.

euphoria

Euphoria har en syntaks som skal være lett å både lære og lese. Engelske ord foretrekkes fremfor kryptiske tegn. Jeg får rett og slett litt BASIC-assosiasjoner. Det har også bare fire innebygde datatyper: atom, sequence, integer og object.

I tillegg til enkelhet vektlegger språket rask utvikling. Det er i utgangspunktet et tolket språk, som f.eks. Python og Ruby, men kan også kompileres til C-kode. Du kan dessuten pakke kildekode sammen med en tolker for å lage selvstendige, kjørbare programmer.

Euphoria har også en meget effektiv garbage collector, og det skrytes av at Euphoria er et av de raskeste tolkede språkene som finnes. Av andre ting som er verdt å nevne har Euphoria en debugger, enkel wrapping (eller tilgang til) C-bibloteker, og en enkel, innebygget database.

Det er flere paraleller til Lua her, som jeg presenterte i går.

Og så skal vi se hvordan koden ser ut

Som vanlig setter jeg igang med å implementere et program som finner summen av alle multipler av 3 eller 5 under 1000, uten å vite noe spesielt om språket på forhånd. API-dokumentasjonen var ganske bra, men det var litt problematisk likevel. Euphoria skal være god på sekvenser, og har et rikt sekvens-biblotek, men funksjonene har ikke de navnene jeg forventer.

Etter litt knoting frem og tilbake kommer jeg frem til følgende løsning:

10 include std/io.e
11 include std/math.e
12 include std/sequence.e
13 
14 function multiplesOf(integer n)
15   return series(0, n, ceil(1000 / n))
16 end function
17 
18 function negate(integer x, object ignored)
19   return x * -1
20 end function
21 
22 procedure main()
23   sequence mults_3 = multiplesOf(3)
24   sequence mults_5 = multiplesOf(5)
25   sequence mults_15 = apply(
26                         retain_all(mults_3, mults_5),
27                         routine_id("negate"))
28 
29   ? sum({mults_3, mults_5, mults_15})
30 end procedure
31 
32 main()

Med litt forklaring bør koden være grei å forstå: Jeg løser oppgaven som et sett-problem, med algoritmen som summerer alle multipler av 3 og alle multipler av 5, for så å trekke fra snittet av disse to, som er alle multipler av 15.

retain_all(a, b) gir meg en sekvens med alle tallene fra b som også er i a. apply(a, routine_id) sender alle elementene i sekvens a til rutinen, og gir meg en sekvens med resultatet – dette tilsvarer altså det som andre steder heter map eller eventuelt select.

Til slutt bygger jeg en ny sekvens som består av de tre sekvensene jeg har laget, og sender denne til den innebygde sum-funksjonen, som summerer alt sammen. Spørsmålstegnet printer ut svaret.

Det rareste er at jeg må bruke routine_id og en streng for å sende en funksjons-referanse til apply. Funksjoner er altså ikke førsterangs borgere i Euphoria. Språket har heller ikke anonyme funksjoner eller lambda-uttrykk såvidt jeg kan se.

Hvorfor bruke tid på Euphoria?

Euphoria er ikke objektorientert. Det støtter ikke funksjonell programmering på en god måte. Det har en enkel syntaks som likevel føles "bråkete". Så hvilken verdi har det?

På OpenEuphoria-forumet leser jeg at Euphoria er et lett språk å lære seg, og at det resulterer i mere lesbar kode enn mange andre språk. Og at man kan løse problemer raskere. Sammenlignet med tolkede språk som f.eks. Python har det mye bedre performance, og er også lett å pakke til en frittstående fil.

Men for å være ærlig føles det litt som å ta en tidsmaskin tilbake til en tid før internett, til et sted hvor noen ikke hadde fått med seg hva som finnes av andre språk der ute. En verden hvor BASIC hadde dødd ut, C var vanskelig, og det egentlig ikke fantes noen andre alternativer. Det var en interessant reise, for all del, og språket kan nok brukes til mye rart. Men jeg tviler på at jeg kommer til å gjøre det.

Jeg er redd jeg kan ha sløst bort tiden din i dag, og at Euphoria blir den store taperen blant språkene jeg presenterer. Jeg lover mye mere spenstige språk i fortsettelsen!

Hvordan komme igang

Er du likevel interessert i å prøve ut Euphoria kan du ta turen til OpenEuphoria.org. Der kan du laste det ned for din foretrukne plattform, og lese så mye dokumentasjon som du bare måtte orke.


comments powered by Disqus