Exercice 1. Supposez qu'une implantation de Scheme utilise le type suivant pour représenter les symboles : (define-type symbol name ; chaîne correspondant au symbole, i.e. "foo" pour le symbole foo ) Implantez les fonctions (string->symbol str) et (symbol->string sym) à l'aide de tables. Souvenez-vous que (eq? (string->symbol "a") (string->symbol "a")) doit être #t. Quel genre de table doit-on utiliser? Implantez aussi une fonction (gensym) qui retourne un nouveau symbole et dont le nom est tiré de la séquence g1, g2, g3, ... Exercice 2. En classe nous avons vu comment implanter avec une table la fonction (object->serial-number obj) qui associe un numéro de série à tout objet, et qui permet au garbage collector de récupérer la mémoire occupée par cet objet lorsqu'il n'est plus accessible. Comment peut-on supporter simultanément la fonction (object->serial-number obj) et (serial-number->object obj) tout en permettant au garbage collector de récupérer la mémoire occupée par cet objet lorsqu'il n'est plus accessible? Qu'arrive-t'il si on entre le numéro de série d'un objet qui a été récupéré? Implantez votre solution et faites des tests pour montrer qu'elle fonctionne. Exercice 3. La fonction de hachage pour les tables "eq?" est la fonction eq?-hash. Donnez le pseudo-code d'une implantation de eq?-hash dans le contexte d'un récupérateur mémoire non-copiant (c'est-à-dire qui ne déplace pas les objets en mémoire). Exercice 4. Écrivez une macro for qui permet de faire des boucles sur un intervalle d'entiers. Voici un exemple d'utilisation de la macro for : > (for i 1 10 (write i) (display " ") (write (* i i)) (newline)) 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 Construisez le code généré avec list et cons. Ensuite faites une nouvelle implantation de cette macro avec quasiquote. Est-ce que votre macro évite les problèmes de conflits de nom? Exercice 5. Implantez la forme spéciale define-type dans sa forme la plus simple (aucun héritage, aucun attributs de champs et aucun prédicat pour tester le type). Utilisez les vecteurs pour représenter les enregistrements. Par exemple la définition de type (define-type point x y) devrait être expansée en (begin (define make-point vector) (define point-x (lambda (obj) (vector-ref obj 0))) (define point-x-set! (lambda (obj val) (vector-set! obj 0 val))) (define point-y (lambda (obj) (vector-ref obj 1))) (define point-y-set! (lambda (obj val) (vector-set! obj 1 val))))