es11

(define (mkPompero x) (list 1 x))                 ;; costruttore di pirimpo Pompero
(define (mkZumpo pirimp ls) (list 2 pirimp ls))   ;; costruttore di pirimpo Zumpo
(define (pompero? pirimp) (= (car pirimp) 1))     ;; predicato di check per pirimpi Pompero
(define (zumpo? pirimp) (= (car pirimp) 2))       ;; predicato di check per pirimpi Zumpo
(define numPompero  cadr)                         ;; selettori
(define pirimpZumpo cadr)
(define listZumpo caddr)

Ovviamente si potrebbe rendere il tutto piu' leggibile
rappresentando un pirimpo Pompero come una lista formata
dalla stringa "pompero" e dal numero, anziche' dalla lista formata da 1 e dal numero;
come anche si potrebbe rappresentare un pirimpo Zumpo
come una lista il cui primo elemento, anziche' essere 2, sia la stringa "zumpo";
Ovviamente bisogna modificare i predicati, mentre i selettori rimarrebero
gli stessi.
Questa scelta permetterebbe anche di realizzare in modo ragionevole
l'eventuale predicato pirimp? che controlla se un oggetto
e' un elemento di tipo pirimp. Tale predicato basta che controlli se
un oggetto e' una lista e se il primo elemento della lista
e' la stringa "pirimp" o la stringa "zumpo".

