Wie man sich über das Nichtvorhandensein von optionalen Argumenten usw.
in AutoLisp hinweghelfen kann, war im Kapitel
Grenzen
zu lesen, hier also
die Fortsetzung zu den Themen 'Makros' und 'Backquoting'.
Was unterscheidet die Funktionen
(set ...) und
(setq ...)
voneinander? Richtig, bei
(setq ...) wird das erste Argument gequotet,
also nicht evaluiert. Wir können also jederzeit statt
(setq ...) auch
(set ' ...) verwenden.
setq ist nichts weiter als ein Makro, das
intern
set aufruft, aber die Evaluation des ersten Arguments verhindert.
Darüber hinaus kann man aber
setq auch noch mit einer variablen Anzahl
von Argumenten aufrufen, um mehrere Zuweisungen gleichzeitig vorzunehmen.
Der AutoLisp-Programmierer hat keine Möglichkeit, solche Makros selbst zu
schreiben. Der Interpreter evaluiert bei selbstdefinierten Funktionen immer
alle Argumente. Selbst über die C/C++ - Schnittstelle ist da absolut nichts
zu machen. Mit deren Hilfe kann man zwar neue AutoLisp-Funktionen mit
variabler Argumentenzahl schreiben, aber trotzdem werden die Argumente vorher
evaluiert!
Wir müssen also damit leben, dass hier nichts zu machen ist. Eine
selbstgeschriebene neue Schleifensteuerung wird also beim Aufruf immer so aussehen:
(ss-foreach 'entity (ssget)
'( ..... )
)
Anders als beim originalen foreach muss das Symbol entity hier also quotiert
werden! Dass auch der body dieser Schleife gequotet übergeben werden muss, liegt
daran, was im Kapitel 'Grenzen' besprochen wurde, nämlich daran, dass die Anzahl
der Funktionsargumente festgeschrieben ist.
Nun zum letzten Thema: Auch Backquoting ist in AutoLisp nicht möglich. Darunter
versteht man die Möglichkeit, innerhalb von quotierten Listen bestimmte Stellen
von der Quotierung auszunehmen, um dort Variablenwerte einzufügen. In AutoLisp
muss man dann also die Liste aus ihren Einzelbestandteilen zusammensetzen, was
mitunter ein wenig mühsam wird. Da es keinen direkten Ersatz für das Backquoting
gibt, möchte ich hier auch auf Beispiele verzichten.
Auch wenn durch das Fehlen von Markros die Häufigkeit des Quote-Zeichens steigt
und durch das Fehlen des Backquotings evtl. ein paar Zeilen mehr Code anfallen:
Alle diese kleinen Mängel sind nicht essentiell! In Verbindung mit der Funktion
(mapin ... ) werden wir auch brauchbare Wege kennenlernen, das Backquoting
zu ersetzen.