Cadmium scheint heute Lern-Laune zu haben;-)
Ich schraube nicht gleich daran rum - aber ein paar Fragen und Feststellungen:
Warum eigentlich ActiveX? Nur weil AutoDesk behauptet, das sei schneller? Ist es doch gar nicht... Jedenfalls liegt hier keine typische ActiveX-Anwendung vor. In diesem "anderen" Thread habe ich z.B. festgestellt, dass man das Entity "BODY" mit ActiveX nicht fassen kann, und vor ein paar Tagen ging's woanders um das Entity "VL-VLO" (im Zusammenhang mit LData). Mit Standard-Lisp kommt man also an alles dran, aber mit der ursprünglichen Version DELALL kann man weder 3D-Explode-Schrott noch LData-Geröll löschen. Mit ActiveX geht nun mal nicht alles!
Zur Fehlerbehandlung: Die finde ich ziemlich rabiat. Da wird eigentlich jeder mögliche Fehler gleich stillschweigend unter den Teppich gekehrt. Es ist aber nun mal so, dass auftretende Fehler oft, aber nicht immer, anzeigen, dass mit einem Programm etwas nicht in Ordnung ist. Dazu zwei Beispiele: Wenn diese HTML-Seite (bei CAD.de) nicht angezeigt wird, weil irgendein AdServer grad mal pinkeln ist und deshalb ein Werbe-Gif nicht kommt, ist es ok, wenn der Fehler mit einem Catch weggebügelt wird. Die Seite ist trotzdem in Ordnung und fehlerfrei, und sie sollte auch trotzdem angezeigt werden. Das andere Extrem wäre, dass jemand in Vlisp versucht, einer Linie einen Radius zu verplätten und großzügig ein (vl-catch-all-apply ...) drumklebt. So wird er unter Umständen nie merken, was er da für einen Quatsch geschrieben hat;-)
Was gibt es hier zu Catchen? Eigentlich nur Ownerships in allen Erscheinungsformen. Ein delete könnte also fehlschlagen, weil das Objekt referenziert wird. Mein Ansatz wäre da eher, statt catchascatchcan eine qualifizierte Rückgabe zu erzeugen (z.B. eine Liste aller Objekte, die sich beharrlich wie ein kleines gallisches Dorf gegen ihre Auslöschung gewehrt haben). Eine Rückgabe fehlt der Funktion ja bisher völlig - denn was ist die Rückgabe von vla-regen?
Unsinn ist das (vl-catch-all-error-p ...). Das ist doch eine Prädikatfunktion, deren Einsatz nur dann Sinn macht, wenn man das Ergebnis mit if, cond, and, or irgendwie auswertet. So verpufft die Rückgabe, denn das Programm will doch gar nicht wissen, ob ein Fehler aufgetreten ist. Wer die Antwort nicht haben will, braucht die Frage auch nicht zu stellen.
Es wäre auch wirklich zu überlegen, ob man eine wiedervendbare Funktion (apply-to-database doit-function) draus macht. Dann könnte man den Scan-Prozess, wie du das nennst, von der transportierten (lambda-)Expression abkoppeln. Möglich wäre eine Universalfunktion für alles, oder getrennte Varianten für Entities und Tabellenobjekte. Im zweiten Fall wäre die Bedienung etwas einfacher.
Zieht man aber (lambda-Expressions durch), ist es wahrscheinlich nicht mehr tragbar, dass hier das Active-Document zweimal abgefragt wird. Auch wenn ich immer gegen unsinnige SETQs predige - hier wäre eines angebracht. Im bösartigsten Fall könnte ja in der Expression ein anderes Dokument aktiviert werden. Dann, wenn ein mit SETQ gebundener Wert mehr als einmal referenziert wird, ist ein SETQ angebracht. Und dann ist da noch inline-Code, den man in eine Unterfunktion auslagern sollte, nämlich die (member...)-Zeilen. Das ist das Copy-Paste-Paradigma in Reinkultur - völlig identische Programmabschnitte!
Tja, Cadmium, ich hoffe, ich hab dir jetzt nicht deine Lern-Laune vergrätzt;-))) Die Kritik ist wirklich konstruktiv gemeint.
Gruß, Axel Strube-Zettler
------------------
(defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP