Wir haben bei der Verwendung von Rechenfunktion bisher
ausschliesslich mit Zahlenwerten gearbeitet, die wir direkt
eingegeben haben. Es gab allerdings eine Ausnahme: Die Zahl
pi haben wir verwendet, in dem wir statt des tatsächlichen
Zahlenwertes einfach den Namen pi eingesetzt haben.
Dieses Prinzip können wir auch mit anderen Namen und anderen
Werten anwenden. Dazu benutzen wir die Funktion
(setq ...).
(setq var1 5) => 5
;var1 ist der Name der Variablen, 5 ist ihr Wert
(setq var2 3) => 3
;(setq) gibt immer den gesetzten Wert zurück
Wir haben jetzt mit
var1 und
var2 (diesen Namen
sind frei gewählt) zwei Variablen angelegt, auf die wir immer
wieder zurückgreifen können. Wir können z.B. damit rechnen:
(+ var1 var2) => 8
(- var1 var2) => 2
Den Wert von Variablen können wir jederzeit wieder ändern:
(setq var2(1+ var2)) => 4
Die Funktion
(1+ ...) wurde bisher nicht erläutert. Sie
erhöht einen Zahlenwert um 1, ist aber schneller als
(+ zahl 1). Entsprechend arbeitet auch
(1- ...).
(+ var1 var2) => 9
;entspricht (+ 5 4)
Beachten Sie, dass die Änderung eines Variablenwertes immer
wieder mit
(setq ...) zugewiesen werden muss. Der Ausdruck
(1+ var1) gibt zwar 6 zurück,
var1 behält aber
immer noch den Wert 5. Erst die Zuweisung
(setq var1(1+ var1)) => 6
setzt den Variablenwert neu. Wir geben nun nacheinander folgende
Zeilen ein:
(setq var1 3)
(setq var2(1+ var1))
(setq var3(+ var1 var2))
(setq var4(1- var3))
Was ist das Ergebnis des Ausdrucks
(+ var1 var2 var3 var4)?
Welche Variablennamen darf man verwenden? Das ist keine leicht
zu beantortende Frage. Das AutoLISP-Handbuch sagt dazu: Sie
können die Namen aus beliebigen Zeichen ausser Punkt, Leerstelle,
runden Klammern, Anführungszeichen, Semikolon und Hochkomma
zusammensetzen. Und dann gibt es noch einen sehr wichtigen
Unterschied zwischen älteren und den neuesten AutoCAD-Versionen:
Bis AutoCAD 14 warnt das Handbuch davor, bereits in Lisp
vorhandenen Namen mit
(setq) einen anderen Wert zuzuweisen.
z.B. ist die Zuweisung
(setq pi 7) technisch völlig ok,
Sie werden allerdings danach an manchen Berechnungen nicht mehr
die volle Freude haben. Es kann Sie auch niemand daran hindern,
folgendes einzugeben:
(setq setq 1) => 1
Danach werden Sie aber feststellen, dass
(setq) einfach nicht
mehr funktioniert. Es wird mit an Sicherheit grenzender
Wahrscheinlichkeit kein einziges LISP-Programm mehr laufen. Der
einzige Weg aus dieser misslichen Lage ist das Laden einer
AutoCAD-Zeichnung (der selben oder einer anderen), da durch die
Befehle "Neu" und "Öffnen" der AutoLISP-Speicher wieder zu-
rückgesetzt wird. Alle AutoLISP-Funktionen sind wieder im
Urzustand, allerdings sind auch alle mit
(setq) gesetzten
Variablen weg.
Ab AutoCAD 2000 sieht die Sache anders aus: Ein Überschreiben
der Namen von Variablen und Funktionen ist zwar auf der
Kommandozeile immer noch möglich, aber aus Gründen, deren
Behandlung hier zu fortgeschritten wäre, funktionieren die
eingebauten Funktionen trotzdem noch.
Man sollte also bei der Vergabe von Variablennamen mit Bedacht
vorgehen. Wichtig ist auch, dass die Namen aussagefähig sind.
Dies spielt zwar im Moment bei unseren Kommandozeilen-Versuchen
keine Rolle, wenn Sie jedoch später ganze Programme schreiben,
sollten Sie sehr darauf achten. Wenn auch in den folgenden
beiden Programmfragmenten einige Ihnen noch völlig unbekannte
Funktionen verwendet werden, können Sie doch sicher zustimmen,
dass die zweite Variante wesentlich leichter zu lesen ist als
die erste:
; zunächst die schwer lesbare Variante
...
(setq og(+ bk bh))
(setq p
(getpoint "\nPunkt wählen: ")
)
(if
(>(cadr p)og)
(princ"\nUngültig!")
)
...
; und hier die bessere!
...
(setq obergrenze(+ blattkante blatthoehe))
(setq klickpunkt
(getpoint "\nPunkt wählen: ")
)
(if
(>(cadr klickpunkt)obergrenze)
(princ"\nUngültig!")
)
...
Lassen Sie sich auch nicht von Hinweisen in älteren
AutoLISP-Handbüchern beeindrucken, dass Variablennamen nicht
länger als 6 Zeichen sein sollten. Dieser Hinweis stammt noch
aus der Zeit, als AutoCAD auf XT-Rechnern mit 512 KB Arbeitsspeicher
und einer Taktfrequenz von 6 Mhz lief. Es ist richtig, dass Namen mit
mehr als 6 Zeichen den Pogrammablauf (theoretisch) etwas verlangsamen.
Dies findet allerdings in einem nicht messbaren Bereich statt. Der
andere Fall ist der Folgende: Sie haben ein Programm geschrieben und
stellen nach ein paar Monaten einen kleinen Fehler fest. Nun sitzen
Sie mit roten Augen vorm Bildschirm und versuchen nachzuvollziehen,
was Sie sich damals bei ihren Hieroglyphen-Kürzeln wohl gedacht haben.
Es kann sein, dass Sie das Programm schneller neugeschrieben haben,
als es dauern würde, sich wieder hineinzuversetzen. Und was spielt
da die halbe tausendstel Sekunde eine Rolle, die das Programm durch
die Unlesbarkeit schneller geworden ist?
Wenn Sie bei Ihren ersten Versuchen vermeiden wollen, dass Sie die
Namen von LISP-Funktionen usw. bei der Vergabe von Variablennamen
überschreiben, dann geben Sie Ihren Variablen z.B. Name in deutsch
(die LISP-Namen sind alle englisch) oder beginnen Sie alle Namen mit
einem Tiefstrich oder lassen Sie sich etwas anderes einfallen.
Übungsaufgaben
-
Stellen Sie sich vor, die beiden Variablen zahl1 und
zahl2 haben Werte, die Sie gar nicht kennen. Ihre Aufgabe
ist es jetzt, zahl1 durch zahl2 zu teilen. Richtig!,
Sie wissen nicht, ob es Ganz- oder Realzahlen sind. Denken Sie
mal nach und überlegen sich eine Lösung (mit Ihrem bisherigen
Wissensstand), mit der Sie die drohenden Probleme umgehen können
und auf jeden Fall ein Ergebnis mit Kommastellen bekommen.
-
Welche der nachfolgenden Ausdrücke sind in AutoLisp illegal?
(setq variable 0)
(setq *anderevariable* 1)
(setq noch-eine-variable 2)
(setq == 3)
(setq , 4)
(setq eine.variable 5)
-
Welche der folgenden Aussagen sind richtig?
-
Bis AutoCAD 14 kann es passieren, dass man die eingebauten
Funktionen überschreibt
-
Es kann in allen AutoCAD-Versionen passieren, dass man die
eingebauten Funktionen überschreibt, ab AutoCAD 2000 ist dies
aber nicht mehr so dramatisch
-
(setq ...) bindet einen Wert an eine Funktion
-
(setq ...) bindet einen Wert an eine Variable
-
Überprüfen Sie folgende (etwas diffizile) Betrachtung: Wenn Sie
den Ausdruck (/ var1 var2 1.0) ausführen lassen und die beiden
Variablen Ganzzahlen enthalten (sagen wir mal 3 und 4), dann wird
nach der Links->Rechts-Regel zuerst 3/4 berechnet, was (als
Ganzzahldivision) 0 ergibt. Erst dann wird durch 1.0 geteilt, und
das Ergebnis wird zu einer Realzahl umgewandelt, also 0.0