FastFiber

OPGELOST - autoload LISP function

Gestart door gery, do 22 12 2016, 08:59:59

Vorige topic - Volgende topic

gery

In AutoCAD kan ik via de LISP functie "autoload" automatisch LISP commando's (dus met c:) laden, dit blijkt echter niet te werken voor LISP functies (dus zonder c:). Heeft iemand hier een oplossing voor?

edit: typefout aangepast
AutoCAD 2020 - Windows 10

roy_043


bart

je kan ze ook verzamelen in een lisp commando en deze laden.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

gery

Bedoeling is de lisp routines pas te laden als ze nodig zijn.
AutoCAD 2020 - Windows 10

roy_043

Hier bestaat geen ingebouwd mechanisme voor. Je kunt zelf iets maken, zoals in de link in mijn vorige post, maar ik zou hier geen tijd aan besteden. Er zijn al zeer veel ingebouwde functies en variabelen. 100 of 1000 extra functies zijn geen probleem.
(length (atoms-family 0))

gery

#5
Ik heb het als volgt oplost:

(if (not function) (load "function")) ; laadt de functie indien nog niet geladen
(function "arg1" "arg2" ...) ; voert de functie uit
AutoCAD 2020 - Windows 10

roy_043

Dat is toch anders dan wat je in jouw vorige bericht aangaf.

gery

Citaat van: roy_043 op do 22 12 2016, 23:18:29
Dat is toch anders dan wat je in jouw vorige bericht aangaf.

Hoezo?
De LISP routine "function" wordt pas geladen als ze aangeroepen wordt vanuit een script of vanuit een LISP of vanuit een menumacro.
AutoCAD 2020 - Windows 10

cadtools@gmail.com

Hoe 'zwaar op de maag', van het geheugen, ligt het als je standaard wen .vlx inlaad van omme nabij 3mb. Ik heb er nooit echt last van om alles mee te nemen. Behalve dat het opstarten even iets langer duurt. Ik heb nog geen tijd gestoken een een demand load mechanisme omdat ik er tot nu toe niet echt het nut van inzag. Scheelt dat er veel? Wat zijn andere voordelen?
Ps fijne feestdagen allemaa !!! :)

roy_043

#9
Citaat van: gery op do 22 12 2016, 23:42:59
Hoezo?
De LISP routine "function" wordt pas geladen als ze aangeroepen wordt vanuit een script of vanuit een LISP of vanuit een menumacro.
(= "load" "autoload") => nil

gery

#10
Citaat van: roy_043 op vr 23 12 2016, 10:10:02(= "load" "autoload") => nil

:? Nu kan ik ff niet volgen.
Wat bedoelt u?
AutoCAD 2020 - Windows 10

roy_043

De essentie van autoload is dat de functie *automatisch* wordt geladen als deze wordt aangeroepen. Jouw oplossing behelst iets anders.

gery

Citaat van: roy_043 op vr 23 12 2016, 13:46:43
De essentie van autoload is dat de functie *automatisch* wordt geladen als deze wordt aangeroepen. Jouw oplossing behelst iets anders.
(if (not function) (load "function")) ; laadt de functie indien nog niet geladen
(function "arg1" "arg2" ...) ; voert de functie uit


Bij deze functie aanroeping wordt eerst nagegaan of de functie al geladen is.
Indien de functie nog niet geladen is, wordt deze eerst geladen en dan (pas) uitgevoerd.
Indien de functie wel al geladen is, wordt deze direct uitgevoerd.
Het uiteindelijke resultaat is identiek aan autoload: de functie wordt pas (volledig) geladen als ze wordt aangeroepen.
AutoCAD 2020 - Windows 10

roy_043

#13
Ik begreep de Lisp-code al, maak je daarover geen zorgen. Maar ik, en vele Lispers met mij (zie de link hiervoor), verstaan iets anders onder autoload. Jouw oplossing hoort bij het probleem: "Hoe voorkom ik dat een Lisp-bestand meer dan één keer wordt geladen". Waarmee ik niet wil zeggen dat het geen goede oplossing is.

gery

#14
Citaat van: roy_043 op vr 23 12 2016, 16:23:53Maar ik, en vele Lispers met mij (zie de link hiervoor), verstaan iets anders onder autoload. Jouw oplossing hoort bij het probleem: "Hoe voorkom ik dat een Lisp-bestand meer dan één keer wordt geladen". Waarmee ik niet wil zeggen dat het geen goede oplossing is.

De LISP-functie "autoload" is eigenlijk bedoeld om minder code op voorhand in te laden maar pas als het echt nodig is, en deze werkt enkel voor LISP-commando's (dus met c: in de functie-definitie). Ik zocht een manier om die functionaliteit van "autoload" ook te kunnen gebruiken voor LISP-functies (dus zonder de c: in de functie-definitie), en dat kan met de simpele code die ik in een vorig bericht opgaf. De test op het al dan niet reeds geladen zijn van de functie is puur voor de efficiëntie, en is niet primordiaal.
De primaire code voor het automatisch laden van de LISP-functie bij het aanroepen van die functie ziet er zo uit:

(load "function") ; laadt de functie
(function "arg1" "arg2" ...) ; voert de functie uit


Deze code heeft dus exact dezelfde functionaliteit als "autoload", dus pas automatisch laden als ze aangeroepen wordt.

De code (if (not function) (load "function")) ; laadt de functie indien nog niet geladen
(function "arg1" "arg2" ...) ; voert de functie uit
heeft als bijkomend voordeel dat de functie slechts éénmalig geladen wordt tijdens de sessie.
AutoCAD 2020 - Windows 10