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".