Poniższe zadania dotyczą metacyklicznego
ewaluatora podzbioru języka Scheme
dostępnego
tutaj. Rozwiązania zadań należy albo
zaprezentować na pracowni 03.02.2015, albo
przesłać na adres e-mail prowadzącego do
10.02.2015.
|
Część I - obowiązkowa (na 03.02.2015)
|
Zadanie 1 (4p.) Kolejność ewaluacji
argumentów funkcji zależy od kolejności, w jakiej
argumenty funkcji ewaluuje Scheme, a dokładnie od
tego w jakiej kolejności są ewaluowane argumenty
operacji cons . Zmodyfikuj ewaluator
tak, by niezależnie od implementacji Scheme'a
ewaluował argumenty:
- od lewej do prawej
- od prawej do lewej.
Zauważ, że w Schemie ewaluacja wyrażenia
(let ((x e1)) e2)
polega na sekwencyjnym wyliczeniu wartości,
najpierw wyrażenia e1 , a następnie
wyrażenia e2 .
|
Zadanie 2 (4p.) Rozszerz ewaluator tak,
by obsługiwał wyrażenie let dostępne
w Schemie. W tym celu ewaluator może albo
tłumaczyć wyrażenie let na wyrażenia
już przez ewaluator obsługiwane (podobnie jak
wyrażenie cond , które jest tłumaczone
na kaskadę if -ów), albo obsłużyć je
bezpośrednio. Zauważ, że wyrażenie
(let ((x1 e1) ... (xn en)) e)
jest równoważne wyrażeniu
((lambda (x1 ... xn) e) e1 ... en).
|
Zadanie 3 (4p.) Rozszerz ewaluator o
obsługę wyrażenia let* . W tym
przypadku również należy użyć translacji do
odpowiednich wyrażeń zbudowanych z
lambda-abstrakcji i aplikacji.
|
Zadanie 4 (4p.) Rozszerz ewaluator o
obsługę wyrażenia letrec . Jednym z
możliwych rozwiązań jest wyrażenie go za pomocą
wyrażeń let oraz set! .
|