Evaluatie, datatypes

Alles wat je in de listener ingeeft, wordt geëvalueerd  (evaluated).
De meeste simpele  (atomaire) datatypes evalueren naar zichzelf, b.v.

Getal (number)

> 2
2
> -0.46e7
-4600000.
> 0.00000000000007
7e-14

True/false: boolean value

> #t
#t
> #f
()
NB: In PCSCHEME wordt false (onwaar) weergegeven als de lege lijst.

Teken (character)

> #\a
#\a
> #\A
#\A
> #\
#\space
> #\space
#\space

Tekenreeks (string)

> "a"
"a"
> "Sabine Buchholz"
"Sabine Buchholz"

Symbool (symbol)

Symbolen zijn variabelen. Zij evalueren niet naar zichzelf, maar naar hun waarde. In het begin is de waarde van een symbool niet gedefiniëerd, daarom krijg je een foutmelding als je het laat evalueren:
> naam
[VM ERROR encountered!] Variable not defined in current environment
NAAM
INSPECT>

Wanneer je deze foutmelding ziet, weet je dus dat je bent vergeten om het symbool een waarde toe te kennen. Om van de INSPECT-prompt af te komen, moet je Ctrl-Q typen.

Special/syntactic forms, keywords

Je kent een symbool een waarde toe met behulp van het keyword define. Daarvoor gebruik je een complexere uitdrukking dan de atomaire uitdrukkingen tot nu toe. Een complexe uitdrukking herken je aan de haakjes eromheen. Een complexe uitdrukking met als eerste element een keyword heet een special form, b.v. (define naam "Sabine Buchholz"). Als je deze special form in de listener laat evalueren, krijg je geen "antwoord" op het scherm te zien, maar vanaf dit moment "weet" de listener wat de waarde van dit symbool is. Dit heet een side effect.
> naam
[VM ERROR encountered!] Variable not defined in current environment
> (define naam "Sabine Buchholz")
NAAM
> naam
"Sabine Buchholz"

Functies

De meeste complexe uitdrukkingen bevatten geen keyword. Neem als voorbeeld (+ 2 3 4). Het eerste element (hier: het plusteken) heet de functor of operator. Dit moet een functie (procedure) zijn. De resterende elementen (hier: 2, 3 en 4) zijn de argumenten of operands. Om deze complexe uitdrukking te evalueren, worden eerst alle elementen afzonderlijk geëvalueerd, daarnaar wordt de functor op de (resultaten van de) argumenten toegepast.
> (+ 2 3 4)
9
> (+ (* 3 4) 2)
14
> (2 3 4)
[ERROR encountered!] Attempt to call a non-procedural object
In het laatste voorbeeld krijg je een fout, omdat 2 geen functie is, dus niet op 3 en 4 toegepast kan worden. Als je deze foutmelding krijgt, is er dus iets mis met het eerste element na de haakjes.

De functor bepaalt hoeveel argumenten hij wil (in twijfelgevallen kan dit afhangen van de implementatie) en van welk datatype de argumenten moeten/mogen zijn:
> (string-append "Hallo " "Bertjan!")
"Hallo Bertjan!"
> (string-append 2 3)
[VM ERROR encountered!] Invalid operand to VM instruction
> (+ 2 3)
5
> (+ "Hallo " "Bertjan!")
[VM ERROR encountered!] Non-numeric operand to arithmetic operation

Deelnemerslijst

> (define naam "Sabine Buchholz")
> (define ANR 123456)
> (define email "buchholz@kub.nl")
> (define telefoon 4668260)
> (define type "docent")
> (define c-ervaring #t)
> (define prolog-ervaring #t)
> (define verdere-ervaring "Pascal, Perl")

> (load "S:/terug/deelneem.txt")
> (print-deelnemer "S:/opdracht/sabine.txt")

Opdrachten

1

Twee variabelen a en b hebben allebei verschillende waarden toegekend gekregen:
> (define a ...)
> (define b ......)
Wat moet je doen om de waarden te verwisselen, zodat a de oude waarde van b krijgt en anderom?

2

Gegeven zijn de volgende definities:
> (define NAAM "Berta")
> (define WERKWOORD "doet")
> (define SIMPELE-NP NAAM)
> (define DET (string-append NAAM "s"))
> (define N "huiswerk")
> (define COMPLEXE-NP (string-append DET " " N))
> (define ZIN1 (string-append SIMPELE-NP " " WERKWOORD " " COMPLEXE-NP))
Wat is de waarde van ZIN1?

3

Wat is de waarde van ZIN1 nadat je het volgende commando hebt uitgevoerd? Waarom?
> (define NAAM "Coenraad")

4

Wat moet je doen om het antwoord hieronder te krijgen? (Gebruik zoveel mogelijk de boven gedefiniëerde variabelen!)
> ZIN2
"Coenraad doet zijn huiswerk"

5

Wat is de waarde van ZIN3? Leg stap voor stap uit hoe hij tot stand komt.
> (define ADJ "leuk")
> (define ADV "niet")
> (define WERKWOORD "vindt")
> (define ZIN3 (string-append (string-append DET " " N) " " WERKWOORD " " SIMPELE-NP  " " (string-append ADV " " ADJ)))
 

Oplossingen