Algorithmische Komposition mit Common Lisp
Listen
Listen sind in Lisp allgegenwärtig. Sie werden durch runde
Klammern (
und )
begrenzt. Zwischen diesen Klammern befinden
sich die Elemente dieser Liste.
Semantik einer Liste
Listen können unterschiedliche Bedeutungen (Semantiken) haben. Sie können Daten darstellen oder eine ausführbare Prozedur bezeichnen.
;;; Listen als Daten: (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29) (Youngju Andrés Miki Elias Richard Camilo Amir Terje Ioannis Junsun Juan Hanyu Raphaël) ((Helmut Lachenmann) (Luigi Nono) (Karlheinz Stockhausen) (Salvatore Sciarrino)) ((c fis cis) (g es) (a gis)) ;;; Listen als Prozeduren (+ 3 2 4) (expt 2 3) (print "hallo peng") (list 'a 'b "hallo" 3 5 1)
Evaluation
Bei der Evaluation einer nicht leeren Liste erwartet das Lisp System als erstes Element eine Funktion, ein Makro oder eine special form, die jeweils angeben, wie die übrigen Elemente der Liste ausgewertet werden sollen.
Quotierung
Wenn eine Liste als eine Liste von Daten behandelt werden soll, kann man mit einem einfachen Anführungszeichen ' unmittelbar vor der öffnenden Klammer die Auswerung der Liste verhindern. Man nennt eine solche Liste mit vorangestelltem Anführungszeichen eine quotierte Liste.
;;; Auswertung einer nicht quotierten Liste, deren erstes Element ;;; weder ein Funktionsname, noch ein Makroname, noch eine special ;;; form ist: (1 2 3 4 5) ;; -> illegal function call ;;; Verhinderung der Auswertung durch Quotierung: '(1 2 3 4 5) ;; -> (1 2 3 4 5)
Leere Liste
Listen dürfen in Lisp auch gar kein Element enthalten. Eine Liste ohne Elemente nennt man leere Liste. Eine leere Liste wird in Common Lisp mit den folgenden, gleichbedeutenden Zeichenfolgen dargestellt:
(), '()
bzw.NIL
1. Eine leere Liste evaluiert zu sich selbst und ist daher im Unterschied zu Listen mit mindestens einem Element ein Atom. Die leere Liste bzw. das SymbolNIL
spielt zudem in Common Lisp eine wichtige Sonderrolle, da es zugleich den boolschen Wahrheitswert "falsch" bezeichnet.
;;; Leere Liste '() ;; -> nil NIL ;; -> nil () ;; -> nil ;;; leere Listen sind Atome! (atom '()) ;; -> t (atom '(1)) ;; -> nil
Fußnoten:
NIL ist ein Akronym für *N*othing *I*n *L*ist.