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










Wenn wir die Funktion + bemühen, um die Zahlen 3 und 4 zu addieren, dann wird sie uns als Ergebnis 7 zurückgeben. Abgesehen davon ändert sich nichts: Die Funktion schreibt nichts auf die Festplatte, manipuliert keine weiteren Daten im Speicher, ändert nicht das Aussehen des Bildschirms usw. Wenn sie ausgeführt ist, ist alles wieder beim Alten. Wenn wir mit (set ...) oder (setq ...) irgendeiner Variablen einen Wert zuweisen, liegt ein etwas anderer Fall vor: Diese Bindung bleibt bestehen, auch wenn der set-Aufruf längst beendet ist. Ebenso ist es, wenn wir mit (defun ...) eine Funktion definieren.

Bei der Rückgabe von + sprechen wir vom Effekt, die Auswirkungen von set, setq und defun nennen wir Seiten- oder Nebeneffekt. Diese Dinge müssen wir sorgfältig zu unterscheiden lernen. Eine Zuweisung mit setq hat also als Seiteneffekt, dass der Variablen (oder auch mehreren) ein Wert zugewiesen wird, der Effekt ist immer der Wert der letzten Zuweisung.
(setq my-var1 -13.05 my-var2 153.76)
    => 153.76 ; dies ist der Effekt
                  
Man sollte die Begriffe nicht falsch bewerten: Sie haben nichts damit zu tun, was wir im Alltag unter einem Neben- oder Haupteffekt verstehen, der Seiten- bzw. Nebeneffekt einer Funktion kann durchaus der Hauptzweck sein. Niemand wird Funktionen wie setq oder defun ihrer Rückgabe, also ihres Effektes wegen verwenden!

Funktionen, die man wegen ihres Effekts aufruft, können in Verschachtelungen eingebettet werden, solche, bei denen der Nebeneffekt im Vordergrund steht, werden meist allein für sich stehend ausgeführt. Da aber jede Funktion einen Effekt hat (aber nur wenige einen Nebeneffekt), kann es hier Ausnahmen geben. Konstruktionen wie (setq var-xx(defun func-yy ... )...) sind also nicht per se ausgeschlossen, aber doch eher ungewöhnlich.

Andererseits haben viele AutoLisp-Programmierer ganz offensichtliche Hemmungen, dort, wo es Sinn macht, Effekte zu verschachteln. Nehmen wir als Beispiel eine Funktion, die die Farbe eines Kreises ändern soll. Zunächst das abschreckende Beispiel:
(defun farbe(ent farbe / entdaten altefarbe neudaten)
  (setq entdaten(entget ent))
  (setq altefarbe (cdr(assoc 62 entdaten)))
  (if(= altefarbe nil)
    (setq neudaten
      (append entdaten(list(cons 62 farbe)))
    )
    (setq neudaten
      (subst altefarbe(cons 62 farbe)entdaten)
    )
  )
  (entmod neudaten)
)
                  
Auf manches hier kann aber wirklich verzichtet werden, wenn wir versuchen, den Effekt einer Funktion als Eingabe für die nächste zu verwenden. Etwas gestrafft würde die Funktion dann so aussehen:
(defun farbe(ent farbe / entdaten altefarbe)
  (entmod
    (if
      (setq altefarbe
        (assoc 62(setq entdaten(entget ent)))
      )
      (subst altefarbe (cons 62 farbe) entdaten)
      (append entdaten(list(cons 62 farbe)))
    )
  )
)
                  
Es spricht überhaupt nichts dagegen, die if-Anweisung in den entmod-Aufruf einzubetten. Ebenso funktionieren die setq-Anweisungen auch dann, wenn sie nicht allein auf einer Zeile stehen! Das Verketten von Effekten spart Rechenzeit, das Zwischenspeichern mit setq verbraucht dagegen recht viel. Lisp kannte übrigens am Anfang gar keine Variablenbindung, diese wurden erst später hinzugefügt.