L'AS nel caso Scheme è particolarmente semplice
essendo estremamente semplice la sintassi del linguaggio, come evidenzia
la grammatica precedentemente
mostrata. Le espressioni sono molto semplici trattandosi sempre di atomi
o strutture composte racchiuse sempre da parentesi tonte. Queste a loro
volta possono essere costituite di atomi o di ConsSexp. Il parser quindi
è molto semplice e costruisce sempre delle AtomSexp o delle ConsSexp.
La RI delle frasi è ad albero (APT) ed è
riassumibile con lo schema seguente:
Il fatto che tutte le espressioni
non atomiche sono delle ConsSexp induce una riflessione. Lo Scheme fornisce
alcune primitive:
la primitiva car (seleziona la testa di una struttura composta);
la primitiva cdr (seleziona la coda di una struttura composta);
la primitiva null (ha successo se l'argomento è una espressione
nulla);
la primitiva cons (costruisce una struttura composta);
la primitiva cond (per realizzare un'istruzione condizionale);
la primitiva quote (restituisce il suo argomento non valutato);
...
le operazioni aritmetiche (+,-,* e /)
le operazioni relazionali (>, = e <)
...
In tutti quei casi il Parser costruisce sempre degli
oggetti ConsSexp nei quali la testa contiene l'operatore (ovvero la primitiva).
Ciò implica che se si vorrà realizzare il valutatore in stile
object oriented allora quando si dovrà valutare una ConsSexp
bisognerà comunque utilizzare delle istruzioni condizionali (catene
di if) per stabilire qual'è l'operatore da applicare agli argomenti.
Non si potrà cioè usare appieno il modello a delegazione
fornito dalla programmazione ad oggetti. Insomma tale modello potrà
essere sfruttato per delegare ciascun oggetto a valutarsi, ma allorchè
si delegherà un oggetto ConsSexp questo dovrà per prima cosa
stabilire qual'è la sua natura, ovvero che operatore contiene.
Una programmazione completamente orientata agli
oggetti avrebbe suggerito una soluzione un po' diversa. Si sarebbero dovute
creare tante sottoclassi di ConsSexp quanti sono gli operatori, ciascuna
dedicata ad un operatore specifico. Ad esempio l'espressione (+ 2 3) sarebbe
stata rappresentata con un oggetto della classe PlusSexp, sottoclasse di
ConsSexp; l'espressione (cdr (quote (1 2))) sarebbe stata rappresentata
con un oggetto della classe CdrSexp, sottoclasse di ConsSexp, la cui coda
sarebbe stata un oggetto della classe QuoteSexp...
Le due soluzioni di cui sopra
presentano entrambe pregi e difetti legati al tipo di metodologia che si
adotterà per realizzare il valutatore. Vedremo più
avanti quali sono questi pregi e difetti, ma prima affrontiamo il discorso
relativo alla valutazione.