Wir sind jetzt an einem Punkt angelangt, wo es vielleicht nicht
mehr allzu effektiv ist, jede Funktion, die wir testen wollen, immer
wieder auf der Kommandozeile einzutippen. Bei einem kleinen Tippfehler
war alles umsonst, und wir müssen wieder von vorne anfangen. Aber
natürlich: AutoLisp stellt uns einen Mechanismus zur Verfügung,
Funktionsdefinitionen in eine Datei zu schreiben und dann zu
laden. Diese Funktion heisst
(load ...).
Ein kleines Beispiel, wie das funktioniert: Wir schreiben eine
Funktion mit einem Texteditor in eine Datei. Für das Beispiel
genügt es, wenn wir unsere Definition für das Quadrat einer Zahl
verwenden:
(defun sqr(zahl)
(* zahl zahl)
)
Als Texteditor sollten wir ein Programm benutzen, das reine
ASCII-Dateien ohne Formatierung schreibt, zunächst einmal genügt
der in Windows eingebaute Editor (notepad.exe) völlig. Später
sollte man sich ach einem geeigneten Editor für Programmierer
umsehen, es gibt z.B. TextPad, Ultra-Edit, Multi-Edit und noch
viele mehr.
Ungeeignet sind Textverarbeitungsprogramme, die Steuerzeichen für
Formatierungen in den Text einbetten, z.B. Word oder WordPad.
Zwar kann man mit diesen Programmen auch reine ASCII-Dateien
schreiben, aber nur, wenn man immer daran denkt, vor dem Speichern
das entsprechende Ausgabeformat zu wählen.
Auf jeden Fall speichern wir unsere Funktion unter dem Dateinamen
'sqr.lsp' auf der Festplatte ab, und zwar erst einmal in einem
geeigneten Verzeichnis. Schliesslich ist eine Festplatte riesengross,
und AutoLisp muss die Datei auch finden können, wenn wir sie laden
möchten. Wir können ein Verzeichnis wählen, das bei AutoCAD in den
Voreinstellungen bereits eingetragen ist, oder wir machen gleich
Nägel mit Köpfen, legen uns ein Verzeichnis für unsere
selbstgeschriebenen Lisp-Programme an und tragen es in den Suchpfad
von AutoCAD ein. Wie das funktioniert, sollte bekannt sein - es
ist genauso, wie wenn wir Blöcke laden wollen.
Jetzt können wir jederzeit unser Programm laden: Wir geben auf der
Kommandozeile
(load "sqr") ein, und schon können
wir quadrieren. Die Datei-Endung
.lsp haben wir hier
weggelassen, Lisp geht davon aus, dass die Endung so lautet. Es
hindert uns nichts daran, der Datei eine andere Endung zu geben,
dann müssen wir beim Laden allerdings den vollständigen Namen
angeben. Ob das aber sinnvoll ist, bleibt dahingestellt...
Mit dem Befehl 'appload' stellt uns AutoCAD eine Alternative zu
(load ...) zur Verfügung. Wer diesen Befehl noch nicht
kennt, kann sich über die AutoCAD-Hilfe damit vertraut machen.
Ich werde hier auf 'appload' nicht weiter eingehen, da das Laden
von Lisproutinen auf diesem Wege viel zu umständlich ist und auch
verschachtelte
loads, auf die wir später zu sprechen kommen,
nicht möglich sind.
Es müssen übrigens nicht unbedingt Funktionsdefinitionen sein,
die wir in der Datei ablegen. Jeder Lisp-Ausdruck, den wir auf
der Kommandozeile eingeben können, kann auch in einer Datei stehen.
Egal, welche und wie viele Ausdrücke in der Datei stehen, sie
werden durch den Ladeprozess evaluiert. Die durch
(defun ...)
definierten Funktionen sind anschliessend geladen, und wenn
in der Datei eine
(setq ...)-Anweisung angetroffen wird,
ist die Variable anschliessend definiert.
Man kann auch Lisp-Dateien laden, die an anderen Stellen auf
der Festplatte oder einem anderen Datenträger liegen. In diesem
Fall muss man natürlich den vollständigen Namen der Datei mit
Pfad eingeben. Dabei ist allerdings eines zu beachten: Der Backslash
'\' ist in Lisp-Zeichenketten ein Steuerzeichen. Es gibt z.B. das
Zeichen '\n' für einen Zeilenumbruch (= newline) in einer
Zeichenkette oder '\t' für einen Tab-Vorschub. Damit ein
Backslash wirklich als solcher interpretiert wird, muss man
ihn doppelt eingeben oder statt dessen einen Schrägstrich
verwenden:
(load "sqr")
; Die einfachste Variante, Datei liegt
; im AutoCAD-Suchpfad
(load "sqr.lsp")
; genauso, aber mit angegebener Endung
(load "a:\\sqr.lsp")
; Die Datei von Diskette laden
(load "a:\\neue programme\\sqr.lsp")
; korrekt, liegt in Unterverzeichnis
(load "a:/neue programme/sqr.lsp")
; ebenso korrekt
(load "a:\neue programme\sqr.lsp")
; so nicht! '\n' ist ein Zeilenumbruch
; und \s ist nichtdefiniert!
; Das wird von AutoCAD so interpretiert:
(load "a:
eue programmesqr.lsp")
; So wird das also nichts!
An dieser Stelle sollte auch nicht unerwähnt bleiben, dass es die
sinnvolle Einrichtung des Kommentars gibt. Ich habe hier bisher
stillschweigend in vielen Beispielen das Kommentarzeichen
;
verwendet, ohne bisher darauf einzugehen. Alles, was in einer
Zeile nach dem Semikolon folgt, wird vom AutoLisp-Interpreter
ignoriert (es sei denn, das Kommentarzeichen ist innerhalb einer
Zeichenkette).
Kommentare sind dazu da, sich selbst (und anderen) eine
Hilfestellung zu geben. Was nützt die schönste Funktion, die
wir auf der Platte abspeichern, wenn aber schon nach vier
Wochen in Vergessenheit geraten ist, was sie macht, wie sie
es macht, wer sie gemacht hat, wann sie gemacht wurde? So könnte
es aussehen:
; Funktion sqr zum Quadrieren einer Zahl (INT oder REAL)
; wird öfters mal benötigt für das Autolisp-Tutorial
(defun sqr(zahl)
(* zahl zahl)
)
Im Kapitel über Stilfragen werden wir noch einmal ausführlich
auf die Kommentierung von Funktionen eingehen.
Übungsaufgaben
-
-