Über die AutoCAD-Kommandozeile kann der Benutzer direkt mit
AutoLISP kommunizieren. AutoCAD erkennt eine an LISP gerichtete
Eingabe daran, dass die Eingabe mit einer linken (öffnenden)
Klammer beginnt. Ist dies der Fall, leitet AutoCAD die Eingabe
an AutoLISP weiter. Auch eine AutoCAD-Eingabe, die mit einem
Ausrufungszeichen beginnt, wird an LISP weitergeleitet, doch
diese Art der Eingabe wird aber erst später behandelt.
Der einfachste Fall einer geklammerten Eingabe an LISP kann
z.B. so aussehen:
(+ 3 4)
Diese Eingabe bewirkt, dass LISP die beiden Zahlen addiert und
das Ergebnis am Bildschirm ausgibt. Diesen Vorgang nennt man
Evaluation des Ausdrucks und Rückgabe des Ergebnisses. Im
Folgenden wird dieser Vorgang so dargestellt:
(+ 3 4) => 7
Dies ist keine exakte Bildschirmabbildung, sondern eine
Schreibweise, die anzeigt, was eingegeben wurde (links vom
Pfeil) und was AutoLISP zurückgibt (rechts vom Pfeil).
Etwas ungewöhnlich mag die Reihenfolge sein, in der die Elemente
des Ausdrucks angeordnet sind. Wir sind alle mit der mathematischen
Schreibweise vertraut, bei der das Pluszeichen zwischen die beiden
Zahlen gesetzt wird (3 + 4 = 12). Von dieser Gewohnheit wird man
sich in LISP trennen müssen, LISP akzeptiert diese Notation nicht.
Bei der Eingabe von LISP-Ausdrücken muss immer als erstes die
auszuführende Operation in der Klammer stehen, und danach können
(je nach Sachlage) ein bis beliebig viele Operanden folgen, d.h.
die Elemente, mit denen die Operation ausgeführt wird.
Auch wenn es vielleicht zunächst etwas schwerfallen wird, sich an
diese Schreibweise (man nennt die Präfix-Notation) zu gewöhnen,
so wird sich doch bald zeigen, dass dadurch die Eingabe wesentlich
effektiver wird als bei der gewohnten mathematischen Eingabeweise
(diese nennt man Infix-Notation). Wenn man z.B. nicht nur zwei,
sondern mehrere Zahlen addieren möchte, so muss man dies in
mathematischer Schreibweise so ausdrücken: 7 + -11 + 9 + -2 + 8
+ 1 = 12. Die mathematische Schreibweise nennt man übrigens auch
Infix-Notation.
Die Präfix-Notation verkürzt die Eingabe deutlich:
(+ 7 -11 9 -2 8 1) => 12
Es gibt auch noch eine Postfix-Notation, bei der die auszuführende
Operation als letztes Element aufegführt wird. Die Postfix-Notation
wird z.B. in der Pogrammiersprache FORTH oder bei manchen
wissenschaftlichen Taschenrechnern verwendet. Sie ist genauso
effektiv wie die Präfix-Notation.
Zurück zu AutoLISP und der Präfix-Notation: Üben Sie ein wenig
die Grundrechenarten und beobachten Sie, wie LISP die eingegebenen
Ausdrücke interpretiert. Fangen wir mit der Addition an:
(+ 1 1) => 2
; Eins und eins ist zwei, wer hätte das gedacht?
(+ 10 -10) => 0
; Auch das war zu erwarten
(+ 1 1 1 1 1) => 5
; siehe Effektivität oben
(+ 1) => 1
; ergibt keine Fehlermeldung
(+) => 0
; ebenfalls keine Fehlermeldung
(+ 1.5 2) => 3.5
; wir nehmen das erstmal zu Kenntnis
Aus diesen Versuchen schliessen wir, dass die Funktion (+)
mit beliebig vielen Argumenten aufgerufen werden kann. Um
das am Rande gleich zu klären: Eine Funktion ist in LISP
die auszuführende Rechen- oder sonstige Operation, und als
Argumente bezeichnet man alle anderen Elemente in der Klammer,
die dem Funktionsaufruf mitgegeben werden.
Wenden wir uns nun der Funktion (-), der Subtraktion, zu:
(- 10 1) => 9
; das sieht doch ganz vernünftig aus
(- 5 9) => -4
; wir können auch rote Zahlen schreiben
(- 1373.40 1409.20) => -35.80
; Einnahmen minus Ausgaben, wie gewohnt...
(- 10 1 1 1 1 1) => 5
; Es werden also alle weiteren Argumente vom ersten abgezogen
(- 7) => -7
; wenn nur ein Argument vorliegt, wird es von 0 abgezogen
(-) => 0
; auch das ist zulässig, aber nicht sehr sinnvoll
Bei der Multiplikation (*) erleben wir auch keine Überraschungen:
(* 3 4) => 12
; alles klar...
(* 1 1) => 1
; Das kleinste Einmaleins
(* 10 11 12) => 1320
; Schon etwas grösser
(* 5) => 5
; Liegt nur ein Argument vor, wird mit 1 multipliziert
(*) => 1
; ergibt immer 1
Beim Dividieren wird sicher alles genauso sein:
(/ 100 5) => 20
; weiß jedes Kind
(/ 100 5 2) => 10
; haben wir uns gedacht
(/ 5 6) => 0
; aber das macht doch etwas stutzig!
(/ 10 3) => 3
; Auch das befriedigt nicht so ganz!
Wir sehen, dass bei dividieren doch etwas merkwürdige Ergebnisse
zum Vorschein kommen. Wie es aussieht, ist LISP hier nicht aus
dem Grundschulstadium herausgekommen: 10 durch 3 ist 3 Rest 1,
wobei der Rest unter den Teppich gekehrt wird. Und 5 durch 6
geht gar nicht rein, Rest 5 wieder unter den Teppich.
So ist es: Die Division wird als Ganzzahl-Operation durchgeführt,
wenn alle Argumente Ganzzahlen sind. Im Gegensatz zu den Ganzzahlen
(auf Computerdeutsch Integers oder Integerzahlen) bezeichnet man
Zahlen mit Dezimaltrennzeichen und Dezimalstellen als Reelle Zahlen
oder - auf Computerdeutsch - Reals oder Realzahlen.
Also noch ein Paar Versuche:
(/ 5.0 6.0) => 0.8333
; das lässt hoffen
(/ 10.0 3) => 3.3333
; es lassen sich also auch Feinheiten erfassen
(/ 10 3.0) => 3.3333
; geht auch
(/ 3) => 3
; Nur ein Argument: wird durch 1 geteilt
(/) => 0
; gar kein Argument ergibt immer 0
Nachdem der Unterschied zwischen Integer- und Realzahlen klar ist,
dürfte auch die Division keine Schwierigkeiten mehr machen, wenn
wir nur immer schön an den kleinen Unterschied denken...
Übungsaufgaben
-
Wie gibt man eigentlich negative Zahlen ein? Ist das hier
zulässig: (- -3) ?
-
Berechnen Sie in der Kommandozeile:
1/7
1/(13*17)
14393 zum Quadrat
(-4 + -6)*(-1 + -7)
-
Stellen Sie sich vor, Sie haben mit einer Zeichnung zu tun, die
in 12 x 12 Planquadrate unterteilt ist, welche von 0 (links unten)
bis 143 (rechts oben) durchnummeriert sind. Welche der hier
besprochenden Rechenfunktionen benötigen Sie, um herauszubekommen,
in welcher Zeile (horizontal!) ein bestimmtes Quadrat liegt?
(Für ganz Spitzfindige: Natürlich laufen die Zeilen immer von
Links nach Rechts!)
-
Welche der folgenden Eingaben verursachen eine Fehlermeldung?
(+ 3 + 4 + 5)
(+3 4)
(+ 5 -3)
(+ 5 - 3)
-
Wir wissen, dass (/ 7 2) nicht 3,5 ergibt, sondern 3. Aber
warum erzeugt (/ 7,0 2,0) eine Fehlermeldung?
-
Wie nennt man die Schreibweise, in der LISP-Ausdrücke
eingegeben werden?
Lösungen