Programowanie funkcyjne, II UWr, 2014/15
Lista zadań nr 10
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:
  1. od lewej do prawej
  2. 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!.
Część II - dla chętnych (do 10.02.2015)

Zadanie 5 (6p.)

Zmodyfikuj ewaluator tak, by implementował strategię ewaluacji call by name zamiast call by value. W tym celu należy odraczać ewaluację argumentów funkcji. Zadbaj o odpowiednią organizację środowiska.

Zadanie 6 (10p.)

Zmodyfikuj ewaluator tak, by mógł się zinterpretować.