lambda-expressions oder lambda-ausdrücke sind eines der grundlegenden
Werkzeuge in AutoLisp. Wer diesen wunderbaren Mechanismus nicht richtig
verstanden hat, wird sich schwer tun, komplexere Mechanismen zu verstehen.
Deshalb geht es in diesem Kapitel nur darum, diese Abläufe noch einmal
zu beleuchten und sie zu erklären.
lambda-expressions sind nichts weiter als Funktionen, die nicht an einen
Namen gebunden sind. Da sie dies nicht sind, können sie auch nur einmal
verwendet werden - Funktionen, die an ein Symbol gebunden sind, können
immer wieder verwendet werden. lambda-expressions sind also eine Art
Einmal- oder Wegwerffunktionen, die aber (anders als im richtigen Leben!)
hervorragend dazu geeignet sind, 'Umweltschäden' zu vermeiden.
lambda-expressions entsorgen sich nach ihrer Anwendung selbst, d.h. es
bleibt von ihnen absolut nichts im Speicher übrig, wenn sie ausgeführt
worden sind. Benannte Funktionen hingegen bleiben dauerhaft im Speicher
hängen, es sei denn, das Symbol bekommt ausdrücklich den Wert nil zugewiesen.
Sie werden dann verwendet, wenn es darum geht, vorhandene Funktionen an
bestimmten Stellen auf die jeweiligen Bedürfnisse anzupassen.
Abgesehen von ihrer Anonymität verhalten sich lambda-expressions wie ganz
'normale' Funktionen. Sie können Argumente bekommen, sie können lokale
Variablen haben, sie haben eine Rückgabe und sie können Seiteneffekte
haben. Wichtig ist, dass ihr Namensraum ebenso auf die Funktion selbst
beschränkt ist wie bei allen anderen Funktionen.
Am häufigsten, aber nicht notwendigerweise, werden lambda-expressions in
Verbindung mit
(mapcar ...) eingesetzt. Daher folgen hier einige
Beispiele für solche
(mapcar '(lambda ...)...) - Anwendungen.
(princ "Sorry - Beispiele werden nachgereicht!")
Ein recht einfaches Beispiel für die Anwendung von lambda-expressions
wird im Kapitel über die Funktionen
(where ...) und
(whereever ...) vorgestellt. Etwas schwieriger wird dann schon
das Kapitel über
(mapin ...), auch diese Funktion erwartet eine
lambda-expression als Argument. Übrigens lassen sich lambda-expressions
durchaus mit
set oder
setq an eine Variable binden. Dann haben
wir die etwas merkwürdige Situation, dass eine anonyme Funktion doch einen
Namen hat.
Ein etwas komplexeres Beispiel für unsere lambda-expressions ist der hier
vorgestellte Funktionsplotter: Er kann dazu verwendet werden, bestimmte
in der Draufsicht rechteckige PMESHs in AutoCAD zur erzeugen. Die jeweilige
Z-Koordinate ist eine Funktion von X und Y. Die Lisp-Funktion besorgt die
ganze Schleifensteuerung, das Inkrementieren von X und Y usw. und die
grafische Ausgabe, das Berechnen von Z aus X und Y bleibt aber frei und
wird der Plot-Funktion jeweils als lambda-expression übergeben.
Der Code des Funktionsplotters: