Scheme

Fra Wikipedia, den frie encyklopædi
Gå til: navigation, søg

Scheme er et funktionsorienteret programmeringssproget og er en af de to mest populære dialekter af Lisp, hvor Common Lisp er den anden. Scheme følger en minimalistisk designfilosofi hvilket har gjort sproget populært blandt programmører og sprogdesignere. Det har medført at der eksisterer rigtigt mange implementeringer som ikke er komplet kompatible.

Scheme blev udviklet ved MIT's laboratorium for kunstig intelligens (CSAIL) af Guy L. Steele og Gerald Jay Sussman som skrev en serie af memoer nu omtalt som Lambda Papers i perioden 1975-1980. Scheme er standardiseret igennem IEEE og en de facto-standard kaldet Revisedn Report on the Algorithmic Language Scheme (RnRS). Mest udbredt er R5RS (1998) mens en nyere R6RS blev ratificeret i 2007.

Scheme var den første Lisp-dialekt som valgte at bruge et leksikalsk virkefelt og også den første til at kræve at implementeringer anvendte halekaldsoptimering. Scheme var også blandt de første sprog til at understøtte first-class continuations.

Historie[redigér | redigér wikikode]

Scheme startede som et forsøg på at forstå Carl Hewitts Actor-model. Steele og Sussman skrev hertil en "lille Lisp-fortolker" i Maclisp og tilføjede efterfølgende "mekanismer til at skabe aktører og sende beskeder." Scheme var oprindeligt kaldt Schemer som følge af en tradition blandt Lisp-afledte sprog som Planner og Conniver. Det nuværende navn Scheme var resultatet af at ITS-styresystemet kun understøttede filnavne med to komponenter på maksimalt seks bogstaver hver.

I dag benyttes betegnelsen Schemer primært om Scheme-programmører.

Udmærkende egenskaber[redigér | redigér wikikode]

Scheme er primært funktionsorienteret. Sproget deler mange egenskaber med andre medlemmer i Lisp-familien af programmeringssprog. Scheme's meget simple syntaks er, ligesom i andre Lisp-dialekter, baseret på s-udtryk (eng. forkortet sexp) som er parentetiske lister hvor første element er en operator og resten er argumenter. For eksempel: (+ 1 2 3), som tager summen af tallene, eller (list 5 10 15), som konstruerer en liste af tallene.

Kildekode i Scheme består derfor primært af sekvenser af indlejrede lister. Lister er samtidigt den primære datastruktur i Scheme, hvilket skaber et meget nært bånd mellem kode og data. Det gør det meget nemt for Scheme-kode at skabe, ændre og evaluere andet Scheme-kode, hvilket forenkler processen ved selvmodificerende kode og metaprogrammering. Et låneord som beskriver denne egenskab er homoikonicitet.

Et eksempel på en Scheme-funktion som udregner det n'te Fibonacci-tal:

(define fib
  (lambda (n)
    (if (or (= n 1) (= n 2))
      1
      (+ (fib (- n 1)) (fib (- n 2))))))

Scheme arver et miljø af listeoperatorer såsom cons, car og cdr, der kan komponere og opdele lister. Scheme har dynamiske typer og understøtter funktioner som værdier. Funktioner kan derfor tildeles som værdier til variable og kan gives som argument til funktioner.

Minimalisme og lambda-kalkylen[redigér | redigér wikikode]

Schemes minimalisme gør det meget nemt at implementere i forhold til andre programmeringssprog med tilsvarende udtrykskraft. Dette skyldes primært brugen af lambda-kalkylen, som oprindeligt var defineret af Alonzo Church i 1930'erne, og muligheden for at definere de fleste af sprogets elementer fra mere primitive former. For eksempel kan 11 af 23 syntaktiske konstruktioner i R5RS-standarden kaldes biblioteksfunktioner, da de kan udtrykkes ved hjælp af de andre.

Lambda-kalkylen inspirerede desuden til brugen af "lambda" som nøgleord for at introducere nye procedurer. De tidligste Lisp-varianter afbildede dog ikke lambda-udtryk særlig præcist grundet måden de håndterede frie variable.

Leksikale virkefelter[redigér | redigér wikikode]

Ligesom mange moderne programmeringssprog, men ulig tidligere Lisp-dialekter som Maclisp og Emacs Lisp, benytter Scheme leksikalske virkefelter: Alle mulige variabel-bindinger i et stykke kode kan udledes ved at læse kildekoden uden hensyn til hvilken kontekst koden vil blive kaldt i.

I 1970'erne var dette et atypisk valg som Sussman tog efter at have studeret programmeringssproget ALGOL. Han foreslog at ALGOL-lignende leksikalske virkefelter kunne hjælpe dem med at implementere Hewitt's Actor-model i Lisp. Denne indsigt blev populariseret i Sussman og Steele's Lambda Paper fra 1975 med titlen Scheme: An Interpreter for Extended Lambda Calculus hvor de adopterede brugen af leksikalske closures.

Se også[redigér | redigér wikikode]