Tracks
/
Common Lisp
Common Lisp
/
Übungen
/
Leslies lange Listen
Leslies lange Listen

Leslies lange Listen

Lernübung

Einführung

Listen

Der Name der Sprache, die wir hier verwenden, Lisp, steht für LIST Processing. Da könnte man annehmen, dass die Sprache etwas für den Umgang mit Listen von Elementen mitbringt, und damit hättest du recht!

Common Lisp hat zwar auch andere Datenstrukturen als Listen, aber Listen werden trotzdem viel verwendet.

Eine Liste in Common Lisp ist eine Folge von Elementen. Sie wird (hauptsächlich aus historischen Gründen) auch Cons genannt. Die Elemente selbst müssen nicht alle denselben Typ haben. Du kannst zum Beispiel eine Liste aus 1, two und "III" haben.

Listen erstellen

Du kannst einfach eine quotierte Liste wie diese eintippen: '(1 two "III"). Dadurch wird eine Liste erstellt und ausgewertet (ausgewertet ergibt sie (1 two "III")).

Außerdem gibt es zwei wichtige Funktionen, mit denen du Listen erstellst: list und cons.

list nimmt null oder mehr Argumente und ergibt ausgewertet eine Liste, die mit diesen Werten erstellt wurde:

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

cons nimmt zwei Elemente und erstellt eine Liste, deren erstes Element das car (der Listenkopf) und deren zweites Element das cdr (der Rest der Liste) ist:

(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)

Mit den Funktionen car und cdr kannst du auf das car und das cdr einer Liste zugreifen.

(first und rest sind Synonyme für car und cdr und funktionieren genau gleich.)

Länge und wahlfreier Zugriff

Die Länge einer Liste kannst du mit length bestimmen. Eine leere Liste hat die Länge null.

Auf ein beliebiges Element kannst du mit nth zugreifen (beachte, dass Listen bei null anfangen zu zählen).

Es ist kein Fehler, einen Index anzufordern, der größer ist als die Liste lang ist. Stattdessen ergibt er ausgewertet nil:

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

Außerdem gibt es mehrere Hilfsfunktionen, um auf die ersten Elemente einer Liste zuzugreifen: first, second, third, und so weiter bis tenth. Praktisch, oder?

Listen kombinieren

Zwei oder mehr Listen kannst du mit append kombinieren:

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

Jedes Argument, das du append übergibst, muss eine Liste sein.

Anleitung

Leslie, das Lisp-Alien, muss einkaufen gehen. Eine Einkaufsliste ist dabei sehr wichtig. Man muss Dinge hinzufügen und wieder entfernen.

Natürlich reichen Stift und Papier für ein Lisp-Alien nicht aus. „List“ ist sogar fast das ganze Wort „Lisp“! Also braucht es ein paar Funktionen, die die Einkäufe im Blick behalten.

Kannst du Leslie helfen, die Einkaufsliste im Blick zu behalten?

1. Eine neue Liste erstellen

Zuerst braucht Leslie eine leere Liste. Eine Funktion namens new-list wäre dafür perfekt.

(new-list) ; => ()

Oh nein... Leslie hat schon ein paar Dinge im Kopf, also braucht Leslie eine Funktion, die drei Dinge entgegennimmt (zum Glück erstellt Leslie nur Listen mit drei Dingen. Nicht mehr und nicht weniger!) und daraus eine neue Einkaufsliste macht. Schreib eine Funktion list-of-things, die drei Dinge entgegennimmt und eine Liste daraus zurückgibt.

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

2. Dinge zur Liste hinzufügen.

Bevor Leslie in den Laden geht, schaut Leslie in die Speisekammer, um zu sehen, was gebraucht wird. Hilf Leslie, indem du die Funktion add-to-list schreibst, die ein Element am Anfang einer Liste hinzufügt.

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

3. Was steht als Nächstes auf der Liste?

Beim Einkaufen möchte Leslie wissen, wonach als Nächstes zu suchen ist. Außerdem schaut Leslie gern in der Liste voraus, um das zweite, dritte oder sogar das 23. Ding zu sehen (die Glückszahl von Leslie).

  • first-thing ergibt das erste Ding auf der Liste
  • second-thing ergibt das zweite Ding
  • third-thing ergibt das dritte Ding
  • twenty-third-thing ergibt das dreiundzwanzigste Ding
(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk

4. Ein Ding von der Liste entfernen

Leslie möchte das erste Element der Liste finden und es aus dem Regal nehmen. Hilf Leslie, indem du eine Funktion remove-first-item schreibst, die eine Liste ergibt, die alles außer dem ersten Element der Eingabeliste enthält.

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

5. Größere Listen aus kleineren Listen

Leslie hat bemerkt, dass aus Versehen zwei Einkaufslisten statt einer entstanden sind! Schreib eine Funktion list-append, die eine Liste zurückgibt, die zuerst die Elemente der ersten Liste und danach die der zweiten Liste enthält.

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

6. Wie lange noch?

Leslie macht sich langsam Sorgen, dass dieser Einkaufsbummel eine Weile dauern wird. Wie viele Dinge stehen überhaupt auf dieser Liste? Schreib eine Funktion just-how-long, die Leslie verrät, wie lang die Liste ist.

(just-how-long '(bread milk butter salt)) ; => 4
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Common Lisp Exercism

Bereit, mit Leslies lange Listen zu starten?

Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.