Factor

Forth var et spennende og anderledes språk – men det er forferdelig gammelt, og virker ikke spesielt praktisk til større og mer komplekse oppgaver. Factor er den moderne arvtageren til Forth; et stack-basert programmeringsspråk med et rikt biblotek, ulike datatyper og til og med objekter, makroer, databasedrivere, et GUI-rammeverk, og med mulighet for å kommunisere med programmer skrevet i C, Objective-C og Fortran.

Forth var en søt liten filosof som kunne lære deg noe grunnleggende om problemløsning. Factor er en orntlig kraftkar som kan løse de utfordringene du har i den virkelige verden!

Factor

Utviklingsmiljøet

Factor er på samme måte som Smalltalk et image-basert språk og utviklingsmiljø. Når man starter det opp får man et vindu hvor man interaktivt kan skrive kode, inspisere datastacken, osv. Miljøet har ulike måter å hjelpe utvikleren, og inkluderer blant annet en hyperlink-basert browser hvor man kan studere biblotekene man har til rådighet, og lære Factor gjennom ulike tutorials.

I skjermbildet nedenfor ser du hovedvinduet til venstre, hvor jeg har laget en ny definisjon og testet den. Vinduet jeg har åpnet til høyre er hjelpe-browseren.

Factor_env

Jeg ble ganske imponert av miljøet egentlig. Det er noe helt annet enn IDE’ene jeg er vandt til, men virker perfekt for oppgaven.

Litt kode

Nå skal vi løse oppgaven vår igjen: finne summen av alle multipler av 3 eller 5 som er mindre enn 1000. Som du vil se ligner definisjonene i struktur svært på de du så i artikkelen om Forth.

10 USING: math kernel sequences math.ranges prettyprint ;
11 IN: euler1
12 
13 : mult? ( x y -- ? ) rem 0 = ;
14 
15 : mult3? ( x -- ? ) 3 mult? ;
16 : mult5? ( x -- ? ) 5 mult? ;
17 
18 : mult3or5? ( x -- ? ) dup mult3? swap mult5? or ;
19 
20 : sumMultsOf3or5 ( seq -- n ) [ mult3or5? ] filter sum ;
21 
22 : solveEuler1 ( -- ) 0 1000 (a,b) sumMultsOf3or5 . ;

Hovedforskjellen fra løsningen i Forth er at jeg her har tilgjengelig en funksjon som oppretter en range for meg på stacken, en annen funksjon som filtrerer, og til slutt en funksjon som summerer hele stacken. Factor har altså et rikere biblotek med kraftigere definisjoner og rikere datatyper enn det Forth har.

Det du ser i parantes mellom definisjonsnavnet og selve implementasjonen er dokumentasjon av hvilke effekter definisjonen vil ha på datastacken. ( x y – ? ) betyr at mult? forventer to elementer på stacken, at disse vil bli “poppet” bort, og at et nytt, boolsk element vil bli pushet tilbake. Du kan godt velge å se på det som en funksjonssignatur, som spesifiserer inn-parametre og ut-parametre.

Koden forklart i detalj

I figurene nedenfor har jeg forsøkt å illustrere hvordan enkelte av ordene jeg har opprettet gjør jobben sin på stacken..

factor1

Over ser du hvordan man kan bruke mult? til å finne ut om 8 er et multippel av 5. Da må 8 og 5 først være på stacken. Rem-kommandoen vil poppe begge tallene, og pushe resten etter divisjon – altså 3 – tilbake på stacken. Deretter pusher vi 0, og så = (erlik-kommandoen), som igjen popper to tall og pusher svaret, som i dette tilfellet er False: 8 er ikke et multippel av 5.

factor2

Over ser du den litt mer kompliserte mult3or5?, som sjekker ett tall som ligger øverst på stacken – i dette tilfellet 20. Først dupliseres det, fordi jeg trenger å teste det to ganger. Deretter kalles mult3?, som spiser ett tall, og pusher om det var et multippel av 3 eller ikke. Så må jeg kjøre swap for å få det andre 20-tallet på toppen, før jeg kaller mult5?.

Til slutt bruker jeg or-kommandoen til å avgjøre om ett av de to øverste elementene er True. Resultatet blir liggende igjen på stacken.

factor3

Til slutt ser du hvordan sumMultsOf3or5 gjør jobben sin (figuren lyver litt, en sekvens ligger faktisk bare som ett element på stacken, men jeg tror ikke det spiller noen rolle for deg akkurat nå).

Input på stacken er altså en sekvens med tall. Deretter pushes det en kodeblokk som inneholder et kall til mult3or5?. Når filter så blir kalt vil den poppe første element (blokken) og kalle den for hvert element i sekvensen. Hvis blokken returnerer True vil tallet bli beholdt. Til slutt kalles sum, som summerer sekvensen, og vi står tilbake med svaret på stacken.

Hvordan komme igang

Factor finner du på factorcode.org. Last det ned for din plattform, og sett igang. På concatenative.org-wikien finner du en rekke tips til hvordan du begynner å lære språket.

Og så var det bare fem dager igjen til Jul. Lykke til!

Ingen kommentarer


Forth

Er du klar for noe veldig anderledes? Si hei til Forth, et stack-basert programmeringsspråk. Forth har røtter helt tilbake til 1958, men er fortsatt i bruk i dag. Og om du aldri kommer til å benytte et stack-basert språk i jobben din, vil det å lære Forth likevel gi deg verdifull kunnskap og alternative måter [...]

Les mer »


COBOL

COBOL ble skapt i 1959, og er den dag i dag et av de viktigste språkene i utallige, kritiske forretningssystemer. COBOL er tungvindt, og COBOL gjør ting enkelt. COBOL er elsket, og COBOL er hatet. Jeg oppfordrer deg ikke til å bli en COBOL-utvikler, men alle seriøse utviklere bør vite hva COBOL er, hvordan et [...]

Les mer »


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 [...]

Les mer »


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 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 [...]

Les mer »


Smalltalk

Det finnes en håndfull språk som har hatt en enorm betydning for utviklingen av programmeringsspråk generelt. Jeg tenker da på språk som Algol, Lisp og C. Et annet språk som vi er nødt til å inkludere er Smalltalk – utviklet av Alan Key og Dan Ingalls med flere ved Xerox PARC på 60/70-tallet. Smalltalk har [...]

Les mer »


CoffeeScript

CoffeeScript er et rykende ferskt språk som rett og slett forsøker å fikse alle problemene med JavaScript. Koden kompileres ned til JavaScript, og har en syntaks inspirert av Ruby, Python og Haskell. CoffeeScript gir deg som webutvikler også noen nye muligheter som list comprehensions, pattern matching, og klasse-basert objektorientering. CoffeeScript er mye mer kompakt og [...]

Les mer »


Oz

Oz er et programmeringsspråk som skiller seg ut i mengden! Det er utviklet i et sammarbeid mellom flere universiteter, brukes først og fremst til undervisning, og støtter mange ulike programmeringsparadigmer som logisk programmering, funksjonell programmering, imperativ og objektorientert programmering osv. Det støtter samtidighetsbasert programmering blant annet gjennom bruk av actors, og er spesielt tilrettelagt for [...]

Les mer »


GNU Octave

De fleste språkene jeg presenterer her på bloggen er såkalte “general purpose” språk som kan brukes til hva som helst. Men av og til kan det være greit å kjenne til språk som er skreddersydd for en spesifik oppgave; som for eksempel matematiske beregninger. Med et slikt verktøy kan man løse enkelte oppgaver mye raskere [...]

Les mer »


Fantom

For cirka seks år siden dukket det opp et interessant språk som utviklerne kalte Fan. Det viste seg derimot å være vanskelig å google det navnet, og spåket endret derfor navn til Fantom i 2009. Fantom er en typisk smeltedigel av egenskaper man finner i andre språk, og er ment å være et praktisk verktøy. [...]

Les mer »



Alf Kåre Lefdal: Distributed Podcast er også ganske interessant. De tar opp tema som fx. ...

Stian: +1 for 6er til This Developer's Life! Min definitive favoritt. Jeg trengte også...

Torbjørn: Takk for flere tips, Vegard. Deep Fried Bytes ligger på oversikten min fra 2009...

Vegar: Og glemte helt ios: Nsbrief og ideveloper live. Har du hørt på deep fried byt...

Vegar: Mye kjekt her. TDL, hanselminutes og .net rocks ligger i en klasse for seg. Suv...

Torbjørn: Helt enig, arkivet til Software Engineering Radio er en gullgruve om man vet hva...

Einar W. Høst: Jeg synes at det kuleste med se-radio er backloggen av intervjuer... det er noen...

arnab: fantastisk :)...

Olav: Glimrende blogg ! Modellen av hjernens arbeid passer ikke bare på nyskaping: ...

Torbjørn: Ja, flydesign trekkes ofte frem som et eksempel på dette fenomenet. Design av b...


 Hold deg oppdatert

Søk i bloggen

Ferske innlegg

  • NodeJS vs. ASP.NET
  • Pulten min..
  • No ifs and buts
  • Community-fiskebolle på ROOTS 2012
  • Kategorier

  • .net ninja (37)
  • Bøker (18)
  • Diverse prosjekter (37)
  • DSL (10)
  • Erlang (10)
  • F# (5)
  • Hardware (1)
  • Jobb (78)
  • Julekalender (51)
  • kjempekjekt.com (23)
  • LISP/Clojure (34)
  • NDC (4)
  • NNUG / community (63)
  • O/RM & databaser (10)
  • Off topic (118)
  • OO-design/clean code (31)
  • Podcasts (15)
  • Polyglot (82)
  • Ruby (29)
  • Silverlight / RIA (3)
  • Software/verktøy (20)
  • Softwareutvikling (24)
  • Testing / TDD (30)
  • the contiki strip (13)
  • User experience (3)
  • WCF (3)
  • Webutvikling (34)
  • WPF (9)
  • WTF (13)
  • Last ned Wallpaper

    Programmeringsbloggens tøffe skrivebordsbakgrunn med snippets fra ulike språk laster du ned her!

    Abonner via epost

    Om du vil kan du få alle nye blogposter tilsendt til din epost. Abonner nå, det er kjempeenkelt!

    Meta