Algorithmische Komposition mit Common Lisp
S-Expression
Eine S-Expression (symbolic expression, abgekürzt auch sexpr) ist ein zusammengesetzer Ausdruck. Hierzu zählen alle Ausdrücke, die als Liste dargestellt werden, das heisst Ausdrücke, die von runden Klammern eingerahmt werden. Listen sind ein wesentliches Charakteristikum aller Lisp Dialekte (der Name Lisp steht für *LIS*t *P*rocessing). Semantisch können Listen grob ausgedrückt drei unterschiedliche Funktionen erfüllen:
Daten
Daten sind semantisch eher passive Komponenten, die der Speicherung von Informationen in verschiedenster Formen dienen.
;; 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 Ioannis Junsun Juan Hanyu Raphaël) '((Helmut Lachenmann) (Luigi Nono) (Karlheinz Stockhausen) (Salvatore Sciarrino)) '((c fis cis) (g es) (a gis))
Funktionsaufrufe
Funktionsaufrufe sind im Unterschied zu Daten aktive Teile eines Programms, die dazu dienen können, Daten zu erzeugen, zu transformieren oder irgendwelche Prozesse in Gang zu setzen, wie beispielsweise das Drucken von Informationen oder allgemeinen grafischen Darstellungen auf dem Bildschirm, das Lesen oder Erzeugen von Dateien oder auch das Erzeugen bzw. Abspielen von Klängen.
(* 7 3 4) ;; -> 84 (print "Hallo Welt") ;; -> "Hallo Welt" (append '(1 2) '(3 4 5)) ;; -> (1 2 3 4 5)
special forms
special forms sind spezielle syntaktische Konstrukte, die die Strukturierung von Programmabläufen ermöglichen, die sich nicht über Funktionsaufrufe realisieren lassen. Bei Common Lisp sind es Listen, die mit folgenden Symbolen beginnen:
block,catch,eval-when,flet,function,go,if,labels,let*,let,load-time-value,locally,macrolet,multiple-value-call,multiple-value-prog1,progn,progv,quote,return-from,setq,symbol-macrolet,tagbody,the,throwundunwind-protect.
(if (< 4 5) 'kleiner 'groesser) ;;; -> kleiner (let ((i 3)) i) ;;; -> 3
- macro forms Ähnlich wie special forms ermöglichen macro forms (oder Makros) spezielle syntaktische Konstrukte. Bei Makros handelt es sich um Definitionen, wie Listen in andere Listen transformiert und dann evaluiert werden. Neben vielen bereits von Common Lisp bereitgestellten Makros ermöglicht das Makro "defmacro" auch die Definition eigener Makros und damit die Erweiterung der Sprache Common Lisp durch neue syntaktische Formen.
(cond ((< 2 1) 'kleiner) ((> 2 1) 'groesser) (t 'gleich)) ;; -> groesser (defun square (x) (* x x)) -> square