Ein paar Worte vorabHome   Letzte MeldungenNews   Index der Kapitel und der besprochenen FunktionenIndex   Wer ich bin, warum ich diese Seiten mache, KontaktImpressum   Ich freue mich über jeden Eintrag im Gästebuch!Gästebuch   Einige Links zu anderen AutoLisp-SeitenLinks   Copyrights und DisclaimerRechts
Hier können die kompletten Seiten als ZIP-File heruntergeladen werden!

Funktionen für komfortables Arbeiten mit Zeichenketten String-Tango
Noch mehr Funktionen für komfortableres Arbeiten mit Zeichenketten Kettenhunde
strtok zerlegt Zeichenketten anhand eines Trennzeichens Tock-Tock
Arbeiten mit Datum und Zeit in AutoLisp Zeitlos...
Dotted pairs - wie man den Programmabbruch verhindert Gepunktet?
Neue Funktionen für die Listenbearbeitung Strukturtapete
Weitere neue Funktionen für die Listenbearbeitung Listen to me!
Lambda expressions - dasSalz in der Suppe Lambada
Lambda expressions anhand eines Praxisbeispiels Unter der Erde
Where und whereever erleichtern den Umgang mit Listen Quo vadis?
Rekursion - Funktionen, die sich selbst aufrufen Katzenschwanz
Ein äusserst wichtiger Prototyp für Funktionen Nix passiert
Wo das lineare mapcar am Ende ist Tiefer rein!
Über Effekte und Neben(Seiten-)Effekte von Funktionen Seitensprünge
Die Namensräume (Sichtbarkeit) von Variablen Raumwunder
Let dient zur Schaffung kleinerer Namensräume Lass mal...
Sukzessive Verarbeitung von Listenresten mit mapcdr Der Bruder
Was in AutoLisp einfach nicht machbar ist (Teil I) Beschränkt
Was in AutoLisp einfach nicht machbar ist (Teil II) Limited Edition
Nicht mit Effekten arbeiten, sondern direkter Daten-Änderung Destruktiv
Sequenzielles vs. paralleles Abarbeiten von Argumenten Parallelwelten
Über den Umgang mit Funktionsschablonen Erwachet!
Ein Praxiskapitel über Auswahlsätze, Attribute, wcmatch und mehr Durch die Brust
Die Farben des AutoCAD Color Index und ihre RGB-Werte Alles so schön
Hier laufen die Fäden zusammen: Viele Konzepte vereint Lapsus Lispuli
Ein Spiel als Beispiel für lernfähige Funktionen Zug um Zug
Errorhandling in AutoLisp - Teil 1 Alles valsch!
Errorhandling in AutoLisp - Teil 2 Und foll Feler!


Zum Einsteiger-Tutorial

Zu den ActiveX-Seiten

Meine Private HP mit Fotos, Gedichten, Musik und Postkartenversand

Mein Online-Lexikon der Fotografie

Mein völlig abgedrehtes Reisebüro










Die hier vorgestellte Funktion (nothing-happens ...) ist in der praktischen Arbeit eigentlich zu nichts zu gebrauchen: Sie gibt das Argument unverändert zurück, und Seiteneffekte hat sie auch nicht. Was macht sie also so interessant, dass ich sie hier veröffentliche? Nun, sie nimmt (wenn es sich nicht um ein Atom handelt), ihr Argument vollständig auseinander und setzt es auch wieder sauber zusammen. Das bedeutet, dass jedes in einer noch so verschachtelten Liste vorkommende Atom zu einem bestimmten Zeitpunkt einmal direkt greifbar ist. nothing-happens ist also ein Prototyp für Funktionen, die Listen durchsuchen und/oder etwas darin manipulieren sollen.

Wie kann so eine Funktion arbeiten? Für das Argument kommen insgesamt vier Fälle in Frage:
  • Das Argument ist nil
  • Das Argument ist ein Atom
  • Das Argument ist ein dotted pair
  • Das Argument ist eine Liste
Im ersten und zweiten Fall wird das Argument unverändert zurückgegeben, fertig. Im dritten Fall wird der car des Paares getrennt vom cdr verarbeitet und dann mit cons wieder zusammengesetzt. Die Verarbeitung erfolgt auf rekursivem Wege. Bei einem dotted pair können wir aber auf die Anwendung der Rekursion auf den cdr verzichten, da es sich ja um ein Atom handeln muss.

Im vierten Fall trennen wir ebenso das erste Element vom Listenrest, es müssen aber beide Teile in die Rekursion geschickt werden, da wir nichts über die Inhalte wissen. Mit (append ...) werden beide Teile wieder zusammengesetzt. Die Rekursion geht so lange weiter, bis irgendwann Atome vorgefunden werden. Die Reihenfolge der vier Fälle sollte nicht verändert werden! Würde man z.B. den ersten und den zweiten Test vertauschen, würden leere Listen (nil!) als Atom behandelt. Ein Vertauschen des dritten und vierten Tests würde zu evtl. auftretenden Abbrüchen durch Fehler führen (s. Kapitel über dotted pairs).

Der Code von (nothing-happens ...) sieht so aus:
(defun nothing-happens(any-data / )
  (cond
    ( (null any-data)nil)
    ( (atom any-data)any-data)
    ( (and
        (=(type any-data)'LIST)
        (cdr any-data)
        (atom(cdr any-data))
      )
      (cons
        (nothing-happens(car any-data))
        (cdr any-data)
      )
    )
    ('T
      (append
        (list(nothing-happens(car any-data)))
        (nothing-happens(cdr any-data))
      )
    )
  )
)
                  
Der Code kann etwas gekürzt werden, wenn man auf die im Kapitel 'dotted pairs' vorgestellte Testfunktion dotted? zurückgreift:
(defun nothing-happens(any-data / )
  (cond
    ( (null any-data)nil)
    ( (atom any-data)any-data)
    ( (dotted? any-data)
      (cons
        (nothing-happens(car any-data))
        (cdr any-data)
      )
    )
    ('T
      (append
        (list(nothing-happens(car any-data)))
        (nothing-happens(cdr any-data))
      )
    )
  )
)
                  
Da nothing-happens jedes Argument völlig unverändert zurückgibt, kann auf Beispiele für die Anwendung verzichtet werden.