Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  autoload versus (defun prog () load prog))

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  autoload versus (defun prog () load prog)) (1450 mal gelesen)
Peter2
Ehrenmitglied V.I.P. h.c.




Sehen Sie sich das Profil von Peter2 an!   Senden Sie eine Private Message an Peter2  Schreiben Sie einen Gästebucheintrag für Peter2

Beiträge: 3701
Registriert: 15.10.2003

Win 10/64 Pro
AutoCAD MAP 3D 2018
BricsCAD 22

erstellt am: 22. Nov. 2004 18:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Mir sind zwei Methoden bekannt, Lisp-Programme bei Bedarf zu laden:

1) die Verwendung von "Autoload"
Beispiel: (autoload "ddvpoint" '("ddvpoint"))

2) ein immer mitgeladenes "mini-defun", welches das gleichnamige Programm lädt und startet:
(defun c:myprog ()
      (load "myprog")
      (c:myprog)
) ; ende defun

Technisch sind mir beide Versionen klar, aber ich frage mich, was die jeweiligen Vor- und Nachteile dieser Lösungen sind.

Schönen Abend

Peter

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Proxy
Ehrenmitglied
Stateless-DHCP v6-Paketfragmentierer


Sehen Sie sich das Profil von Proxy an!   Senden Sie eine Private Message an Proxy  Schreiben Sie einen Gästebucheintrag für Proxy

Beiträge: 1629
Registriert: 13.11.2003

Tastaturen, Mäuse,
Pladden, ...,
AutoCADs 200X, SWX 2kX

erstellt am: 22. Nov. 2004 20:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

AutoLoad geht in Verbindung mit der Windows Registry und nur einmal pro session innerhalb der Zeichnung, mit (manuellnachloaden mit (defun ... ) ist etwas solala da du keine Prüfung machst ob es bereits geladen ist, daher ist es bei unsauberer gemachten Lisps etwas heikel wenn z.B. inenrhalb der Lisp ein DCL eingebaut worden ist. The AutoLISP autoload function makes a command available without loading the entire routine into memory. steht in der Hilfe, dürfte nun der grösste Unterschied festgestellt sein. In Verbindung mit VBA ist da grösste orsicht geboten da der Speicher schnell einem flötten geht.

------------------
"Lisp?!?! Why the Hell did you pick the most arcane, obscure, and hopelessly-rooted-in-the-computer-science-department language in the world for an AutoCAD programming language?"  Read the whole story: The Autodesk File ca. 890 Seiten | 7500 KB PDF

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Peter2
Ehrenmitglied V.I.P. h.c.




Sehen Sie sich das Profil von Peter2 an!   Senden Sie eine Private Message an Peter2  Schreiben Sie einen Gästebucheintrag für Peter2

Beiträge: 3701
Registriert: 15.10.2003

Win 10/64 Pro
AutoCAD MAP 3D 2018
BricsCAD 22

erstellt am: 22. Nov. 2004 20:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

 
Zitat:
Original erstellt von Proxy:
AutoLoad geht in Verbindung mit der Windows Registry und nur einmal pro session innerhalb der Zeichnung,


The AutoLISP autoload function makes a command available without loading the entire routine into memory. steht in der Hilfe, dürfte nun der grösste Unterschied festgestellt sein. In Verbindung mit VBA ist da grösste orsicht geboten da der Speicher schnell einem flötten geht.


Ich verstehe es nicht ganz - kannst du das bitte nochmals erklären?
Danke

Peter

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)

[Diese Nachricht wurde von Peter2 am 22. Nov. 2004 editiert.]

[Diese Nachricht wurde von Peter2 am 22. Nov. 2004 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADchup
Ehrenmitglied V.I.P. h.c.




Sehen Sie sich das Profil von CADchup an!   Senden Sie eine Private Message an CADchup  Schreiben Sie einen Gästebucheintrag für CADchup

Beiträge: 3329
Registriert: 14.03.2001

Sicher ist, dass nichts sicher ist. Selbst das nicht.
Joachim Ringelnatz

erstellt am: 22. Nov. 2004 20:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

Hi,

sieh' es einfach so:
Mit (autoload) wird die Funktion erst geladen, wenn Du sie zum ersten Mal innerhalb der Acad-Session brauchst.
Alle anderen Varianten laden die Funktion immer am Anfang einer Session, obwohl Du sie mitunter gar nicht benutzen wirst.


Gruß
CADchup

------------------
www.cadditions.de

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 22. Nov. 2004 23:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

ich möchte mal aufräumen mit dem weitverbreiteten Irrtum, dass (load ...) irgendwelche Programme lädt. Das kann so sein, muss aber nicht.

Die Funktion (load...) macht lediglich eines: Sie evaluiert einen bzw. mehrere Ausdrücke, die in einer Datei stehen! Macht mal einen kleinen Test - schreibt mal diese Zeichenkette in eine Datei:
"qig wdkls jhfö özfufzh fw zfwz"
Mit den Anführungszeichen! - dann als "test.lsp" abspeichern.

Dann gebt ihr (setq var(load"test")) auf der Kommandozeile ein und seht, dass jetzt var den Inhalt "qig wdkls jhfö özfufzh fw zfwz" hat. Das hat doch absolut nichts mit Funktionen zu tun, oder?

Aussagen wie "Alle anderen Varianten laden die Funktion immer am Anfang einer Session, obwohl Du sie mitunter gar nicht benutzen wirst" sind per se erstmal falsch - wer will denn schon wissen, was in den mit (load) geladenenen Ausdrücken drinsteht?

Schon wenn man diesen Code hier abändert:

(defun c:myprog ()
  (load "myprog")
  (c:myprog)
)

etwas abändert:

(defun c:myprog ()
  (if null *myProgLoaded*(load "myprog"))
  (c:myprog)
)

sieht die Sache völlig anders aus. Die globale Variable *myProgLoaded* zeigt dabei an, ob nur der Stub oder oder das Programm geladen wurde. Im alten AutoLisp war das alles noch einfacher, da hätte man z.B. über (length c:myprog) feststellen können, ob's der Stub oder das Programm ist.

Die Alternative ist nicht "Autoload" vs. "Was anderes". Der gesamte Autoload-Mechanismus ist nur eine Möglichkeit von vielen, wie man so einen Mechanismus implementieren kann. Aber jeder kann sich was besseres schreiben.

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

Peter2
Ehrenmitglied V.I.P. h.c.




Sehen Sie sich das Profil von Peter2 an!   Senden Sie eine Private Message an Peter2  Schreiben Sie einen Gästebucheintrag für Peter2

Beiträge: 3701
Registriert: 15.10.2003

Win 10/64 Pro
AutoCAD MAP 3D 2018
BricsCAD 22

erstellt am: 22. Nov. 2004 23:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Original erstellt von mapcar:
Die Alternative ist nicht "Autoload" vs. "Was anderes". Der gesamte Autoload-Mechanismus ist nur eine Möglichkeit von vielen, wie man so einen Mechanismus implementieren kann. Aber jeder kann sich was besseres schreiben.

Und was ist nun "was besseres"?

Peter

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 23. Nov. 2004 21:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

Peter, letztendlich bleibt das jedem selber überlassen. Ich handhabe das meist so, dass meine komplexeren Programme aus einer User-Interface-Funktion bestehen, die immer geladen ist, etwa so:

(defun c:hauptprogramm( / aufgabe param)
  (setq aufgabe <user-input auswerten>
        param <user-input auswerten>
  )
  (cond
    ( (= aufgabe 'dieses)
      (if(null dieses(load"dieses.lsp")))
      (dieses param)
      ; (setq dieses nil)
    )
    ( (= aufgabe 'jenes)
      (if(null jenes(load"jenes.lsp")))
      (jenes param)
      ; (setq jenes nil)
    )
  )
)

Das setzt sich dann oft fort, d.h. in "dieses" oder "jenes" werden dann wieder Teile nachgeladen, falls sie benötigt werden. Die Darstellung ist natürlich stark vereinfacht, ind der Praxis gibt es natürlich mehr als einen Parameter usw. <user-input> kann eine Dialog oder die Summe der Kommandozeileneingaben sein.

Wie gesagt, Geschmackssache. Ich nehme diesen Weg, weil er direkt im Programm implementiert wird, ich muss mich also nicht mit zusätzlichen Dateien usw. befassen, und meine Registry von 200MB (?) macht mir sowieso Sorgen;-) Das Programm selbst muss ich natürlich entweder mit load laden oder in die acad.lsp eintrage, aber ganz ohne einen Eintrag geht ja autoload auch nicht.

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

[Diese Nachricht wurde von mapcar am 23. Nov. 2004 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz