----- 1/12/10 ----- > Nell'intento di definire una funzione per aggiungere una lista > in coda all'altra,Êsi e' verificato un problema. Il codice e': > > ; unisco 2 liste > > (define add-list ; valore : lista > (lambda ( l1 l2 ) ; l1, l2 : liste > (let ( (y (list-ref l2 0)) ) > (if (= (length l2) 0) > l1 > (add-list (cons y l1) (cdr l2)))) > )) > > valutando l'espressione: > > (add-list '(1 2) '(3 4)) > > viene riportato il messaggio d'errore: > > list-ref: index 0 too large for list: empty > > Come mai il programma produce un errore benche' quando si verifica > la condizione che lista2 e' vuota l'output dovrebbe essere lista1 ? > Invece, modificando la condizione: > > (if (= (length l2) 1) l1 ... ) > >Êil valore restituito e', come ci si aspetta: > > (list 3 1 2) > > Dovve sta il problema? ----- 1. Per quanto riguarda l'errore segnalato, il motivo e' poco piu' che sintattico: in base alla strutturato del programma, indipendentemente dal fatto che la lista l2 sia vuota o meno, l'espressione che definisce il valore associato ad y all'interno del let, (list-ref l2 0), viene valutata prima di valutare la condizione dell' "if", determinando inevitabilmente un errore a qualche livello di ricorsione. 2. La struttura del programma non e' comunque adeguata: primo elemento di l2 diventa il primo elemento di l1 nella successiva invocazione ricorsiva e (alla fine il risultato sara' che la seconda lista viene "ribaltata all'inizio della prima" (detto un po' grossolanamente). Suggerimento. Le domande che conviene porsi sono le seguenti: - Quale deve essere il primo elemento della lista risultante? - Come possiamo trattare i casi in cui una delle liste non ha elementi? ----- * -----