Vorige                       Inhoud                      Volgende
_________________________________________________________________

SASL                    860409          (c) 1986 by ORD-GROUP  48


Deze  definitie  wordt dan wel een cyclische structuur maar  daar
heeft de interpreter geen last van. De functie 'fac' is nu geheel
geschreven  als een graaf met daarin referenties naar  standaard-
functies.

Dit  hele proces kan worden gegeneraliseerd naar  meerdere  argu-
menten.  In  het  midden van een cel kunnen dan  meerdere  combi-
natoren  achter  elkaar staan die ieder een argument in de  goede
richting(en) doorsturen.

De  interpreter krijgt een expressie van de compiler  aangeboden.
De interpreter probeert die expressie uit te rekenen door te gaan
invullen. De voornaamste regels zijn:

( (p B q) r)    =   (p (q r))
( (p C q) r)    =   ((p r) q)
( (p S q) r)    =   ((p r) (q r))

d.w.z.  Het invullen van de combinatoren die we hierboven  hebben
gegenereerd.  Als  de interpreter een standaardfunctie  tegenkomt
dan  wordt de desbetreffende subroutine met de  goede  argumenten
aangeroepen.  Het kan worden aangetoond dat er op deze manier het
goede antwoord uitkomt.

Dit  lijkt  veel eenvoudiger dan het werk dat  de  compiler  moet
doen.  In de praktijk is het, voor zover wij kunnen overzien, een
stuk  moeilijker.  Ten  eerste moet de interpreter vanwege  effi-
cientieoverwegingen  in  assembler worden geschreven  terwijl  de
compiler   best   in  een  hogere  programmeertaal   kan   worden
geschreven. Ten tweede bestaat een groot deel van het werk van de
interpreter  uit het werken met 16 bits waarden.  Als de snelheid
van  het  programma  belangrijk is dan wordt dit op  een  8  bits
machine op z'n zachtst gezegd onoverzichtelijk. De indexregisters
van  de Z80 zijn vrij langzaam en kunnen daarom niet al  te  veel
worden gebruikt. Ten derde is het rekenen met zeer grote getallen
lang niet eenvoudig. De problemen betreffende de garbagecollector
zullen nog besproken worden.

Al met al rijst de vraag 'waarom zo moeilijk?'.

Zonder combinatoren is het veel moeilijker om lazy evaluation toe
te passen. Als we bijvoorbeeld de volgende SASL definities hebben
voor een functie f van variabelen:

f 0 b=1
f a b="een of andere expressie in a en b"

we kunnen dan vragen om b.v.  ((f 0) (fac -1) )
Volgens  de  definitie van fac duurt het uitrekenen  van  fac(-1)
oneindig  lang.  Maar omdat het eerste argument van f 0 is hebben
we  het tweede helemaal niet nodig,  er komt 1 uit.  SASL zal dan
ook netjes 1 als resultaat geven.  Dit is mogelijk omdat bij  het
invullen  van  het eerste argument een functie ontstaat  die  het
tweede  argument  weggooit.  Voor zover wij weten is  dit  zonder
combinatoren nog veel moeilijker om op te lossen.

_________________________________________________________________

Vorige                       Inhoud                      Volgende