Algorithmische Komposition mit Common Lisp
Cycle
Die folgende Funktion definiert ein cycle
Pattern mit den
Elementen '(2 1 3 4) und bindet dieses Pattern an das Symbol
*testpattern*
.
(defparameter *testpattern* (new cycle :of '(2 1 3 4)))
Daten werden mit der Funktion next
generiert. Wenn die Funktion
kein Argument hat, wird pro Funktionsaufruf genau ein Wert gemäß
den Regeln des Patterns generiert. Ein cycle
Pattern hat die
Eigenschaft, dass die einzelnen Elemente zyklisch ausgelesen
werden.
(next *testpattern*) ;; -> 2 (next *testpattern*) ;; -> 1 (next *testpattern*) ;; -> 3 (next *testpattern*) ;; -> 4 (next *testpattern*) ;; -> 2 (next *testpattern*) ;; -> 1 (next *testpattern*) ;; -> 3 (next *testpattern*) ;; -> 4 (next *testpattern*) ;; -> 2
Wird der Funktion next
als 2. Argument der Wahrheitswert T
übergeben, wird eine komplette Periode bis zum Ende der aktuellen
Periode als Liste zurückgegeben.
(next *testpattern* t) ;; -> (2 1 3 4) (next *testpattern* t) ;; -> (2 1 3 4) (next *testpattern* t) ;; -> (2 1 3 4)
Eine Zahl als 2. Argument von next
gibt die Anzahl der zu
generierenden Daten an:
(next *testpattern* 100) ;; -> (2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 ;; 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 ;; 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4 2 1 3 4)
Pattern sind grundsätzlich unendlich, d.h. die Funktion next
gibt immer einen Wert aus.