Rebol


torsdag 15. desember 2011 Julekalender Polyglot Rebol

Er du en rebell som stiller spørsmål ved etablerte sannheter? Da er kanskje REBOL et programmeringsspråk for deg. Rebol gjør opprør mot kompleksiteten vi ser i dagens software og språk.

rebol

REBOL står for Relative Expression Based Object Language. Første versjon kom i 1997, utviklet av selveste Carl Sassenrath, som var arkitekten og primær utvikler av AmigaOS i sin tid, og som i 1985 introduserte multitasking til PC-verden.

(Denne artikkelen omhandler REBOL 2. REBOL3 er en komplett omskrivning som har vært under utvikling en stund nå, og som har en god del endringer, men er fortsatt i alpha.)

REBOL setter enkelhet i høysetet. Det har i grunnen mange likheter med Lisp – det er symbolsk og homoikonisk for dem som skjønner hva det innebærer – men er likevel et mere moderne språk enn Lisp. Språket er dynamisk og sterkt typet. Det støtter flere programmeringsparadigmer, og har blant annet prototype-basert objektorientering (sånn som JavaScript).

Plattformen – om man kan kalle det det – er veldig liten og kompakt (dokumentasjonen sier ultra-kompakt), og programmene man lager blir også overraskende små.

Her ser du en figur som viser hvilke språk som har influert REBOL, og det faktum at REBOL var en viktig inspirasjonsskilde for JSON:

rebol_legacy

Hva kan man bruke REBOL til?

Et av hovedfokusene i REBOL er nettverkskommunikasjon og distribuerte løsninger. Det legger også vekt på utvikling av domenespesifike språk og meta-programmering. REBOL inkluderer grafisk brukergrensesnitt (GUI) som er likt på tvers av plattformer, funksjoner for bildemanipulering, parsing, komprimering, sikre nettverkstjenester, lyd, en database og mye mer.

Du kan bruke REBOL til å lage desktop applikasjoner, dynamiske web apps og server-tjenester, mobilapplikasjoner m.m. Det inkluderer også noe som nesten må betegnes som et virtuelt operativsystem:

"REBOL can also be used immediately, without installation, on over 40 operating systems as a lightweight file manager, text editor, calculator, database manager, email client, ftp client, news reader, image viewer/editor, OS shell, and more. You can use it as a simple utility program with a familiar interface to common computing activities, on just about any computer, even if you're unfamiliar with the operating system."

På tide med litt kode

Som vanlig var det første jeg gjorde i REBOL å implementere en løsning på Eulerproblem nummer 1. Helt uten forkunnskaper tok det meg kun 10-12 minutter å implementere en fungerende løsningen som du ser nedenfor:

10 REBOL [ Title: "Euler Problem #1" ]
11 
12 dividable-by: func [x y] [ 0 = modulo x y ]
13 
14 dividable-by-3-or-5: func [x]
15 [
16   (dividable-by x 3) or (dividable-by x 5)
17 ]
18 
19 sum: 0
20 repeat i 999
21 [
22   if dividable-by-3-or-5 i
23   [
24     sum: sum + i
25   ]
26 ]
27 
28 alert to-string sum

Den første linjen er en obligatorisk REBOL-header som kan inneholde diverse metadata om programmet. diviable-by er den første funksjonen som sjekker om et tall x er delelig på et tall y. dividable-by-3-or-5 bruker nevnte funksjon til å sjekke om x er delelig på 3 eller 5.

Jeg definerer så en variabel sum, og kjører en løkke fra 1 til 999 hvor jeg legger alle tall som er delelige på 3 eller 5 til sum. Til slutt åpner jeg en dialogboks / alert-vindu som presenterer svaret.

All indentering og alle linjeskift er forresten helt valgfrie, og har ingen betydning. Jeg kunne ha skrevet programmet på én linje om jeg hadde villet, men koden hadde selvsagt ikke vært så lesbar da.

En funksjonell løsning

Koden over var en imperativ løsning på oppgaven. Etter å ha studert språket litt ville jeg også forsøke å lage en løsning lignende den stream-baserte løsningen jeg presenterte i posten om Eulerproblemet.

REBOL egner seg greit for denne typen programmering (viste det seg), men inneholder derimot ikke de forventede funksjonene som range, filter, map og reduce out-of-the-box. Derfor lagde jeg dem selv.

Koden nedenfor illustrerer flere aspekter ved REBOL; de tre funksjonene range, filter og fold ("reduce" var opptatt og betyr noe annet i Rebol) er plassert som metoder på et prototype-objekt som jeg kaller fp (for funksjonell programmering). Jeg har også endret implementasjonen av dividable-by-3-or-5, og i den nøstede avslutningen av scriptet – som i praksis er Lisp-kode uten paranteser – bruker jeg en anonym funksjon.

10 REBOL [ Title: "Euler Problem #1, Functional style" ]
11 
12 ; Using prototype as namespace..
13 fp: make object! [
14   range: func [a b] [
15     r: copy []
16     for x a b 1 [ append r x ]
17   ]
18   filter: func [predicate list] [
19     new-list: copy []
20     foreach x list [
21       if predicate x [ append new-list x ]
22     ]
23   ]
24   ; Also known as reduce, collect, inject, aggregate
25   fold: func [initial f list] [
26     acc: initial
27     foreach x list [ acc: f acc x ]
28   ]
29 ]
30 
31 dividable-by-3-or-5: func [x] [
32   any [ zero? modulo x 3
33         zero? modulo x 5 ]
34 ]
35 
36 ; Barely readable, almost lisp but without parentheses :)
37 alert to-string
38       fp/fold 0 func[acc x] [ acc + x ]
39               fp/filter :dividable-by-3-or-5
40                         fp/range 1 999

Kontrollspørsmål til leseren: Hva returnerer range-funksjonen? Den returnerer selvfølgelig en liste med tall, men hvordan? En funksjon i REBOL returnerer resultatet av det siste uttrykket, og det er en for-løkke. For-løkken gjør det samme, den returnerer (eller evaluerer til om du vil) resultatet av det siste uttrykket i siste iterasjon – og det er funksjonskallet append. Append legger et element til en liste, og returnerer selve listen (altså r). Derfor returnerer range listen r, som bygges opp i for-løkken.

Samme teknikk benyttes også i filter og fold, og gjør koden kompakt og elegant.

En grafisk løsning

Rebol inneholder en egen dialekt – en intern DSL – for å lage grafiske brukergrensesnitt. Dette gjør det veldig enkelt å lage GUI. Min siste løsning viser hvordan jeg lager et lite vindu med en knapp som viser resultatet når man klikker på den.

10 REBOL [ Title: "A Visual Euler1 solution" ]
11 
12 euler1: does [
13   use [sum] [ sum: 0
14     repeat i 999 [
15       if any [ zero? modulo i 3
16                zero? modulo i 5 ] [
17         sum: sum + i
18       ]
19     ]
20   ]
21 ]
22 
23 view layout [
24   backcolor white
25   header: h1 "Euler #1"
26   button "Calculate answer" 180 [
27     header/text: to-string euler1
28     show header
29   ]
30 ]

Og slik ser det ut når programmet kjøres, før og etter at knappen trykkes:

eulerGUI

Hva er ikke så bra med REBOL, og hva er alternativet?

For det første: Bare deler av REBOL er open source, og språket finnes både i en gratis-utgave og i en betalt versjon med kommersiell support. For noen kan dette være problematisk og "skummelt". Men gratisutgaven kan benyttes kommersielt, nesten uten noen restriksjoner.

REBOL har dessuten begrenset støtte for multithreading, og dette kan by på utfordringer for enkelte bruksområder.

En ting som kan være litt skummelt i Rebol er at variabler du oppretter inne i funksjoner er tilgjengelig i det globale "scopet" – samme utfordring som i Lua eller JavaScript egentlig (om man der glemmer "local" eller "var"). I det grafiske eksempelet unngikk jeg problemet ved å bruke use-funksjonen til å deklarere sum-variabelen, som da kun vil eksistere inne i use-blokken. Det finnes flere andre måter å gjøre dette på – men vær obs på at problemet er der.

I det funksjonelle eksempelet tok jeg ikke hensyn til dette, og introduserte variablene r, new-list og acc til det globale navnerommet uten at det var tiltenkt!

Litt sært?

Det største problemet ifølge enkelte er likevel at REBOL-communitiet er litt sært. Det kan virke som om filosofien bak språket har gått folk til hodet! Die-hard REBOLere bruker vistnok ikke det vanlige Internettet – det er for stort og komplekst – REBOL-baserte nettverk foretrekkes. Carl Sassenrath har OGSÅ nektet å bruke Subversion til REBOL-koden fordi han ikke vil bruke et system som er 50 ganger større og mer komplekst enn REBOL er i seg selv (les Fight Software Complexity Pollution).

Disse tingene har ført til utviklingen av et nytt open-source programmeringsspråk som er basert på REBOL. Dette heter Red, og har vært under utvikling i et drøyt halvår. Det skal gi deg det meste av hva REBOL har, men i tillegg ha støtte for parallellisering gjennom actors, støtte lavnivå systemprogrammering ala C med inline assembly, og være lett å embedde i andre systemer (som Lua). Det vil også legge vekt på å ha et godt IDE med gode debuggings-muligheter, og spåket vil ha en statisk kompilator og en JIT-kompilator.

Hvordan komme igang

Naviger til www.rebol.com og last ned siste versjon av REBOL/View for din plattform. Når du starter programmet får du opp en slags desktop hvor du kan navigere deg gjennom et hav av eksempler som du kan kjøre og studere kildekoden til.

Rebol_env

For å begynne å kode er det aller enkleste å lage en ny tekstfil med navn som ender på ".r". Vim er en av flere editorer som har støtte for REBOL-syntaks, men støtten er strengt tatt ikke nødvendig. Og er du på Windows som meg kan du eksekvere r-filene direkte for å kjøre programmene.

Måten jeg begynte å lære var at jeg åpnet siden Learn REBOL, og rett og slett søkte og skumleste meg frem til det jeg trengte for å løse min første oppgave. Det kan hende min erfaring fra bl.a. Lisp og Forth hjalp meg endel. Etterhvert kan du lese det mere nøye, og i tilleg støtte deg på REBOL Function Dictionary, en API-referanse for enkeltfunksjoner.

Går du virkelig inn for full indoktrinering kan du gå igang med online-boken REBOL/Core Users Guide. Du finner alt dette og mye mer på REBOL Documentation-siden.

Konklusjon

REBOL er kompakt, praktisk, portabelt, produktivt, og sist men ikke minst anderledes! REBOL peker nese til moderne mainstream-språk, og hevder at det alle andre gjør er feil. Det hevdes at REBOL er enkelt å komme igang med, at selv vanlige folk uten programmeringsbakgrunn raskt kan lage nyttige og kraftige verktøy og scripts, og at profesjonelle utviklere heller ikke vil finne noen spesielle mangler i språket/miljøet.

Jeg har lekt meg endel med REBOL nå, og må innrømme jeg er ganske fasinert – språket er absolutt elegant. Det er litt som en "Lisp Light", og det er bra. Jeg vil ha mer!

Noen av tingene jeg har sett på er blant annet hvordan man kan kjøre rebol på Windows i IIS, og hvordan man kan lage kode-genererende add-ins til Visual Studio – begge deler er fullt mulig.

Avslutningsvis, hvis du vil vite mer: her har du en link til en times-lang video hvor Carl Sassenrath forteller om språket sitt. Enjoy!


comments powered by Disqus