;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 4.1 ;;; Lecture de documentation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 4.2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar *my-readtable* (copy-readtable)) (set-syntax-from-char #\] #\) *my-readtable*) (set-macro-character #\[ (lambda (stream char) (declare (ignore char)) (let ((l (read-delimited-list #\] stream t))) `(make-instance (quote ,(car l)) ,@(cdr l)))) nil *my-readtable*) ;; autre solution sans utiliser backquote (set-macro-character #\[ (lambda (stream char) (declare (ignore char)) (let ((l (read-delimited-list #\] stream t))) (cons 'make-instance (cons (list 'quote (car l)) (cdr l))))) nil *my-readtable*) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 4.3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defclass personne () ((date-naissance :initarg :date-naissance))) ;; CL-USER> (let ((*readtable* *my-readtable*)) ;; (read)) ;; [personne :date-naissance (encode-universal-time 0 0 0 23 02 1991)] ;; (MAKE-INSTANCE 'PERSONNE :DATE-NAISSANCE ;; (ENCODE-UNIVERSAL-TIME 0 0 0 13 12 1961)) ;; CL-USER> (describe (let ((*readtable* *my-readtable*)) ;; (eval (read)))) ;; [personne :date-naissance (encode-universal-time 0 0 0 13 12 1961)] ;; # is an instance of class #. ;; The following slots have :INSTANCE allocation: ;; DATE-NAISSANCE 1954882800 ;; ; No value (defvar *save-readtable* *readtable*) (setf *readtable* *my-readtable*) ;; CL-USER> [personne :date-naissance (encode-universal-time 0 0 0 23 02 1991)] ;; => # ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Exercice 4.4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; La *readtable* a la même valeur qu'avant l'appel à "load". ;; Voir la page concernant "load" dans la HyperSpec : ;; load binds *readtable* and *package* to the values they held before ;; loading the file. ;; ce qui signifie que LOAD fait l'équivalent de : ;; (let ((*readtable* *readtable*) ;; (*package* *package*)) ;; ) ;; Cela veut dire qu'une modification de la valeur d'une de ces deux ;; variables lors du chargement du fichier sera défaite lorsque l'on ;; sort du "let".