Naar inhoud springen

Scheme

Uit Wikipedia, de vrije encyclopedie
Scheme
Scheme
Paradigma Functioneel
Verschenen jaren 70
Ontworpen door Guy Steele, Gerald Jay Sussman
Huidige versie R7RS-small[1] Bewerken op Wikidata
Typesysteem dynamisch, sterk
Implementaties PLT Scheme, MIT/GNU Scheme en anderen
Dialecten T [1]
Beïnvloed door Lisp, Algol
Invloed op Common Lisp, JavaScript, Ruby, Dylan, Lua, Clojure
Bestandsextensies .scm, .ss
Website http://plt-scheme.org/
Portaal  Portaalicoon   Informatica

Scheme is een functionele programmeertaal. Het is een dialect van de programmeertaal Lisp. Guy L. Steele en Gerald Jay Sussman ontwikkelden het in de jaren zeventig en presenteerden het aan de academische wereld in de zogenaamde Lambda Papers. De taal is gebaseerd op de lambdacalculus. De taal heette oorspronkelijk 'Schemer', in de traditie van talen als Planner en Conniver, maar werd ingekort door de beperkingen van het ITS-besturingssysteem dat geen bestandsnamen toeliet van meer dan 6 tekens.

De filosofie achter Scheme is minimalisme. Het doel is niet om uitbreiding op uitbreiding te stapelen, maar om zwakheden en beperkingen te verwijderen die uitbreidingen nodig schijnen te maken. Daarom heeft Scheme zo min mogelijk primitieven waarmee de rest geïmplementeerd kan worden. Het belangrijkste mechanisme voor control flow is staartrecursie.

Scheme was de eerste variant van Lisp die uitsluitend lexicaal variabelenbereik (in tegenstelling tot dynamisch variabelenbereik) gebruikte. Net zoals Lisp, gebruikt Scheme garbage collection om geheugenplaatsen met ongebruikte data te hergebruiken. De taal gebruikt lijsten als belangrijke datastructuur, maar kent daarnaast vele andere. Door het minimalisme van de Scheme-specificatie bestaat er geen standaardsyntaxis voor het maken van structuren met benoemde velden, of ondersteuning voor object-georiënteerd programmeren, maar bijna elke implementatie ondersteunt deze uitbreidingen.

Kenmerkend aan Scheme is dat het gebruikmaakt van prefixnotatie van bewerkingen in plaats van het meestgebruikte infix. Bijvoorbeeld 3+5 is een infixnotatie voor de optelling (de operator + bevindt zich tussen de 3 en de 5) terwijl + 3 5 de prefixnotatie is waarbij de operator (+) zich voor de twee operanden bevindt (3 en 5).

De Scheme standaard

[bewerken | brontekst bewerken]

Regelmatig wordt de taal geüpdatet. Er worden dan wijzigingen aan de standaard aangebracht. De huidige standaard dateert van 2013 en heet R7RS, wat staat voor Revised7 Report on the Algorithmic Language Scheme, naar het document met de officiële beschrijving van de taal. Bovendien bevat de taal een reeks van zeer nuttige bibliotheken. Dit zijn de zogenaamde SRFI's, wat staat voor Scheme Request For Implementation.

Scheme streeft normaal minimalisme na. Dat was ook het geval tot en met R5RS. R6RS bracht echter grote wijzigingen toe aan de taal. Daarom besliste het Scheme Steering Committee, dat instaat voor de standaardisatie van de taal, om te taal te splitsen. De ene tak zal er een uitgebreide, moderne programmeertaal zijn, terwijl de andere tak het minimalisme behoudt. De minimalistische specificatie van R7RS werd reeds geratificeerd in 2013.

In deze sectie zullen we enkele kenmerken van Scheme opsommen. Deze lijst is niet exhaustief.

Functieaanroep en evaluatie van argumenten

[bewerken | brontekst bewerken]

In Scheme worden alle argumenten van een functieaanroep geëvalueerd vóór de eigenlijke aanroep. De volgorde waarin de argumenten geëvalueerd worden is niet bepaald. Men kan dus niet aannemen dat deze evaluatie van links naar rechts of in eender welke andere volgorde gebeurt. Hier moet men dus rekening mee houden wanneer men argumenten meegeeft die een neveneffect veroorzaken.

Scheme kent een klein aantal special forms waarbij de argumenten op een andere manier uitgewerkt worden. Een goed voorbeeld hiervan is de if special form. Deze heeft volgende syntaxis:

(if <predicaat> <consequent> <alternatief>)

Wat we natuurlijk niet willen is dat alle argumenten van een aanroep op voorhand geëvalueerd worden, afhankelijk van de waarde van het predicaat mag ofwel het consequent ofwel het alternatief uitgevoerd worden. Dit gedrag kan men enkel verkrijgen bij special forms. Verder kunnen macro's gebruikt worden om zelf procedures/special forms met eigen evaluatieregels te schrijven. Zonder gebruik van special forms is het onmogelijk om volgend stuk code te schrijven:

(define (deling teller noemer)
  (if (= noemer 0)
      (display "Kan deling niet uitvoeren, noemer is nul!")
      (/ teller noemer))) ; Indien de if de normale regels zou volgen, zou ook dit alternatief uitgewerkt worden als de noemer nul is!

; Aanroep van de procedure geeft het verwachte resultaat.
(deling 14 2)
> 7

; Er treedt geen error op wanneer de noemer nul is.
(deling 100 0)
> Kan deling niet uitvoeren, noemer is nul!

Scheme wordt gekenmerkt door een speciale syntaxis waar veelvuldig gebruik wordt gemaakt van haakjes. Alle expressies worden tussen haakjes genoteerd. Dit heeft enkele concrete gevolgen:

  • Iedere expressie begint met een keyword of een procedurenaam.
  • De volgorde waarin bewerkingen uitgevoerd worden hangt volledig af van de haakjes.
  • Operators zoals + en - kunnen een arbitrair aantal argumenten hebben, door gewoon meer argumenten op te sommen.
(+ 1 2)
> 3

(+ 1 2 3 4 5)
> 15

(- 1) ; De minusoperator kan ook met één argument opgeroepen worden.
> -1

; De volgorde van bewerkingen wordt aangegeven door de haakjes.
(* (+ 2
     (- 3 1))
   4)
> 16
[bewerken | brontekst bewerken]
  1. https://small.r7rs.org/.