Track
/
Common Lisp
Common Lisp
/
Esercizi
/
Le lunghe liste di Leslie
Le lunghe liste di Leslie

Le lunghe liste di Leslie

Esercizio di apprendimento

Introduzione

Liste

Dato che il nome del linguaggio che stiamo usando, Lisp, sta per LIST Processing, si potrebbe pensare che il linguaggio abbia strumenti per gestire liste di elementi, e avresti ragione!

Anche se Common Lisp ha strutture dati diverse dalle liste, le liste sono comunque molto utilizzate.

Una lista in Common Lisp è una sequenza di elementi. È anche chiamata cons (per ragioni storiche, soprattutto). Gli elementi stessi non devono essere dello stesso tipo. Per esempio puoi avere una lista di 1, two, "III".

Creare le liste

Puoi semplicemente digitare una lista quotata come questa: '(1 two "III") e questo farà sì che venga creata e valutata una lista (si valuta in (1 two "III")).

Ci sono anche due funzioni principali usate per creare liste: list e cons.

list accetta zero o più argomenti e si valuta in una lista creata con quei valori:

(list 1 'two "III") ; => (1 two "III")

cons accetta due elementi e crea una lista che ha il primo elemento come suo car (la testa della lista) e il secondo come suo cdr (il resto della lista):

(cons 1 2)            ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil)          ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)

Le funzioni car e cdr possono essere usate per accedere al car e al cdr di una lista.

(first e rest sono sinonimi di car e cdr e funzionano esattamente allo stesso modo.)

Lunghezza e accesso casuale

La lunghezza di una lista può essere determinata usando length. Una lista vuota ha lunghezza zero.

Si può accedere a un elemento arbitrario con nth (nota che le liste sono indicizzate da zero).

Non è affatto un errore richiedere un indice più grande della lunghezza della lista. Invece, si valuta in nil:

(nth 23 '(short list)) ; => nil

Ci sono anche diversi metodi ausiliari per accedere ai primi elementi di una lista: first, second, third, fino ad arrivare a tenth. Carino, eh?

Combinare le liste

Due o più liste possono essere combinate con append:

(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '())     ; => (A B C)

Ogni argomento passato a append deve essere una lista.

Istruzioni

Leslie, l'alieno del Lisp, deve fare la spesa. Avere una lista della spesa è molto importante. Bisogna aggiungerci delle cose e toglierne delle altre.

Naturalmente, per un alieno del Lisp non bastano certo carta e penna. «List» è già buona parte della parola «Lisp»! Ci devono pur essere delle funzioni scritte per aiutare a tenere traccia della spesa.

Puoi aiutare Leslie a tenere traccia della lista della spesa?

1. Creare una nuova lista

Prima di tutto, Leslie deve creare una lista vuota. Una funzione chiamata new-list sarebbe perfetta per questo.

(new-list) ; => ()

Oh no... Leslie ha già in mente qualche cosa, quindi serve una funzione che prenda tre elementi (per fortuna Leslie crea liste di soli tre elementi. Né più, né meno!) e che crei una nuova lista della spesa con quelle cose. Scrivi una funzione, list-of-things, che prende tre elementi e restituisce una lista che li contiene.

(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)

2. Aggiungere cose alla lista.

Prima di andare al negozio, Leslie guarda nella dispensa per vedere cosa serve. Aiuta Leslie scrivendo la funzione add-to-list, che aggiunge un elemento all'inizio di una lista.

(add-to-list 'butter '(bread)) ; => '(butter bread)

3. Quali sono le prossime cose sulla lista?

Mentre fa la spesa, Leslie vuole sapere cosa cercare dopo. A Leslie piace anche sbirciare avanti nella lista per vedere il secondo, il terzo o addirittura il ventitreesimo elemento (il suo numero fortunato).

  • first-thing restituirà il primo elemento della lista
  • second-thing restituirà il secondo elemento
  • third-thing restituirà il terzo elemento
  • twenty-third-thing restituirà il ventitreesimo elemento
(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk

4. Rimuovere una cosa dalla lista

Leslie vuole trovare il primo elemento della lista e rimuoverlo dallo scaffale. Aiuta Leslie scrivendo una funzione remove-first-item, che restituisce una lista con tutto tranne il primo elemento della lista di input.

(remove-first-item '(bread butter milk)) ; => '(butter milk)

5. Liste più grandi a partire da liste più piccole

Leslie ha capito di aver fatto per sbaglio due liste della spesa, non una! Scrivi una funzione, list-append, che restituisce una lista con gli elementi della prima lista seguiti da quelli della seconda.

(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)

6. Quanto è ancora lunga?

Leslie comincia a preoccuparsi che questa spesa richiederà parecchio tempo. Ma quante cose ci sono su questa lista? Scrivi una funzione just-how-long che dica quanto è lunga la lista.

(just-how-long '(bread milk butter salt)) ; => 4
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Common Lisp Exercism

Vuoi iniziare Le lunghe liste di Leslie?

Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.