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)))