;;; ===== Suchraum ========================================= ; Die Funktion erzeugt den Suchraum: '((1 . 1) (1 . 2) ... )' (define Suchraum (let loop ((zeile 8) (spalte 8) (akku ())) (cond ((zero? zeile) akku) ((zero? spalte) (loop (sub1 zeile) 8 akku)) (else (loop zeile (sub1 spalte) (cons (cons zeile spalte) akku))))))
Anmerkung: Es handelt sich hierbei eigentlich nicht um eine Funktion, sondern um eine Variable. Sie wird beim Übersetzungsvorgang des Programmes mit dem beschriebenen Wert belegt und ihr Wert kann dann von den anderen Prozeduren aufgerufen werden.
Die Programmtechnik ist ein typisches Beispiel einer geschachtelten, doppelten Schleife in Scheme.
Im Kopf werden zwei Schleifenvariable definiert, nämlich die für den Spaltenindex und die für den Zeilenindex. Die lokale Variable akku ist notwendig, da nicht normal rekursiv, sondern endrekursiv (also prinzipiell iterativ) gearbeitet wird.
Eine doppelte Schleife entsteht dadurch, dass der Körper der Schleife zwei Abfragen enthält, nämlich nach den Werten der beiden lokalen Variablen zeile und spalte. Die äußere Schleife muss dabei zuerst abgefragt werden - allgemeine Regel: immer erst den Abbruchfall testen!
Entsprechend muss der Abbruchfall der inneren Schleife danach getestet werden, damit zur nächsten Zeile gewechselt werden kann, bevor der "Normalfall" des Aufrufs des nächsten Spaltenelementes durchgeführt werden kann.