Scheme/Racket - Lista nr 10 (17.01.13)

Zadanie 1 (10p.)

Zaimplementuj w Schemie maszynę SECD służącą do ewaluacji termów rachunku lambda. Opis maszyny można znaleźć np. w pracy "A Rational Reconstruction of Landin's SECD Machine". Przyjmij jako punkt wyjścia opis oryginalnej maszyny podany w sekcji 2.1 tej pracy. Ponadto przyjmij następujące założenia:
  1. Środowisko jest reprezentowane jako lista par zmienna-wartość (np. '((x . 3) (y . 4)))
  2. Termy, na których operuje maszyna to: literały całkowitoliczbowe, zmienne (reprezentowane jako symbole Scheme'a, np. 'x), lambda-abstrakcje (reprezentowane jako listy o 3 elementach, z których pierwszy to zawsze symbol 'lambda, np. '(lambda x x)), oraz aplikacje (listy dwuelementowe, np. '((lambda x x) 3)).
  3. Główna funkcja nazywa się run i przyjmuje jako argument konfigurację maszyny, będącą listą czteroelementową złożoną z komponentów S, E, C, D (wg opisu).
  4. W celu badania struktury wyrażeń zdefiniuj odpowiednie akcesory, np. gdy chcemy wydobyć z lambda-abstrakcji jej ciało, używamy akcesora lambda-body zdefiniowanego tak: (define (lambda-body exp) (caddr exp)). Dzięki temu kod będzie czytelny i niezależny od sposobu reprezentacji danych.
  5. W przypadku wyrażeń o niepoprawnej strukturze wyświetlaj komunikat o błędzie.