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