| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
| |
 | HPE ProLiant Summer Academy 2025 in Wien, eine Veranstaltung am 17.09.2025
|
Autor
|
Thema: warum wird dieses defun nicht geladen? (1311 / mal gelesen)
|
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 19. Dez. 2017 15:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich kanns mir mal wieder nicht erklären. Ich habe in einer Datei zig defun die alle geladen werden, jedoch dieses nicht. Hat das was mit der in-package zuweisung zu tun? Wenn ich den defun Code in die Befehlszeile kopiere, klappt es. Sonst sagt er kann "mitte1_2d_def" nicht finden Code: (in-package :greskamp) (use-package :OLI)(DEFUN mitte1_2d_def (mitte1) (If (sd-inq-curr-wp) (setq mitte1_2d (sd-gpnt3d-to-2d (sd-vec-xform mitte1 :source-space :global :Dest-space (sd-inq-curr-wp)))) (display "keine aktive Arbeitsebene vorhanden") ) mitte1_2d )
Oder liegt es daran das ich am Ende die Variable "mitte1_2d" noch mal ausgebe? ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
     
 Beiträge: 2296 Registriert: 3.20. ● PE60+80@home ● W10 Pro Build10.0.19045.5737 ● Drafting V17~V20.7@job ● Modeling V17~V20.7@job ● Windchill 12.1.2.6@job ● UWGM Client 13.0.0.1@job ● Taschenrechner ● Stift+Zettel V8.42
|
erstellt am: 19. Dez. 2017 18:43 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Zitat: Original erstellt von Greskamp: ich kanns mir mal wieder nicht erklären. Ich habe in einer Datei zig defun die alle geladen werden, jedoch dieses nicht.Wenn ich den defun Code in die Befehlszeile kopiere, klappt es. Sonst sagt er kann "mitte1_2d_def" nicht finden Oder liegt es daran das ich am Ende die Variable "mitte1_2d" noch mal ausgebe?
Code: ..... ) mitte1_2d ) ;; end defun
Was heisst denn hier "ausgeben" - Du schreibst da nen Variablen Name hin. Was aber viel "schlimmer" ist: wenn es keine Workplane gibt, gibt es beim ersten Aufruf der Funktion einen LISP fehler (und wie wird der wohl heissen??) Du benutzt nemmlich kein (let (...))! Damit ist die Variable mitte1_2d gar nicht definiert (es sei denn Du hast die Funktion schon vorher einmal mit vorhanderen CurrWP aufgerufen). Zeige-Finger-schwenk!!!! Variablen deklariert/definiert mann!!!! (und Frau auch!) Guck mal so: Code: (in-package :greskamp) (use-package :OLI)(defun mitte1_2d_def (mitte1) (let (mitte1_2d) (If (sd-inq-curr-wp) (setq mitte1_2d (sd-gpnt3d-to-2d (sd-vec-xform mitte1 :source-space :global :Dest-space (sd-inq-curr-wp)))) (display "keine aktive Arbeitsebene vorhanden") ) mitte1_2d ;; return value ) ;; end let ) ;; end defun
Das ist (war) einfach unsauber programmiert (JEDE variable ist zu definieren, und damit Pasta!) und ich finds lustig das der Fehler auf so grauslige Art zurueck schlaegt. Der NAME der Funktion die, du da definiert hast, laesst mich allerdings unterm Strich schlimmeres vermuten.
JEDE Variable die du/ihr mit einem setf/setq setzen wollt muss
- in einem let definiert sein, oder
- ein Funktions Uebergabe Parameter sein oder
- via defvar definiert werden oder
- via defparameter definiert werden oder
- via multiple-value-bound... oder
Aber ein (setf ... ) ohne was 'davor' ist immer ein grosses Risiko. Andere Programmiersprachen schimpfen da ganz heftig. LISP leider nicht. Zumindest nicht bei interpretiertem Lisp code (compile-file zeigt solche eklatanten Fehler an). ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 19. Dez. 2017 19:01 <-- editieren / zitieren --> Unities abgeben:         
Hallo und danke, soviel Schimpfe noch im alten Jahr. Ich habe mich immer gefragt für was dieses let benutzt wird weil es ja auch ohne geht. Und laut lisp-foren braucht man das setf auch eher weniger als das setq. Und mit ausgeben meine ich das dann der punkt der dort ermittelt wurde auch im CAD genommen wird, sonst hat man ja nur eine Variable definiert. Sorry für mein gebrochenes Programmierdeutsch. Ich habe mir lisp mehr oder weniger selbst beigebracht und da sind ein paar basics unter gegangen.
------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
der_Wolfgang Moderator Tastenhauer
     
 Beiträge: 2296 Registriert: 3.20. ● PE60+80@home ● W10 Pro Build10.0.19045.5737 ● Drafting V17~V20.7@job ● Modeling V17~V20.7@job ● Windchill 12.1.2.6@job ● UWGM Client 13.0.0.1@job ● Taschenrechner ● Stift+Zettel V8.42
|
erstellt am: 19. Dez. 2017 19:25 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
(setf .. (setq ... sind diesbezeuglich gleichbedeutend. Wann immer du eine Funktion hast, die ein paar interne Variablen braucht: setze ein (let ... ) ein. siehe auch: http://ww3.cad.de/foren/ubb/Forum92/HTML/000884.shtml#000001 Oft "geht es gut" ohne let/defvar/defpar (leider!). Bei Dir hat es 'nur beim Laden' gerumst. Was eigentlich angenehm ist! Schlimmer sind die Faelle wo funktion X eine (unbeabsichtig erzeugte) globale variable setzt und.. 2 Stunden spaeter ein anderes Tool DIESEN wert dann liest fuer einen voellig andern Zweck und es DANN im system klappert! DAS kann man dann nemmlich schwer nachvollziehen. Deswegen warne ich da immer sehr vehement mit der Definition von variablen. Ein (seq current-wp ... ) ist schnell geschrieben, aber wenn das dann "woanders" abgefragt wird (when current-wp) .. unter Umstaenden in einem ganz anderem LISP file.... Diese "nicht definierte variable" Warnung ging ja an ALLE, nicht nur an Dich. ------------------ ● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ● Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 19. Dez. 2017 21:29 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
|
Greskamp Mitglied Ingenieur
  
 Beiträge: 523 Registriert: 12.03.2003
|
erstellt am: 20. Dez. 2017 10:14 <-- editieren / zitieren --> Unities abgeben:         
ihr habt irgendwie beide recht. Ich habe das eben noch mal probiert. Also ohne das LET geht es auch, es lag daran wie ich den Befehl aufgerufen habe Zuerst hatte ich mit (mitte1_2d_def greskamp::mitte1) aufgerufen, das ging auch manchmal, zumindest wenn ich das defun in die befehlszeile kopiert hatte. Aber nachdem ich das ganze mit LET probiert hatte und es immer noch geladen wurde, habe ich jetzt (greskamp::mitte1_2d_def greskamp::mitte1) probiert, und das scheint zu gehen. in-package und use-package und das ganze drum rum ist noch was, was ich nur durch ausprobieren hin bekomme.... ------------------ Gruß Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
 
 Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 20. Dez. 2017 10:45 <-- editieren / zitieren --> Unities abgeben:          Nur für Greskamp
Zitat: in-package und use-package und das ganze drum rum ist noch was, was ich nur durch ausprobieren hin bekomme....
*WINK* Schau mal hier: http://www.flownet.com/gat/packages.pdf (The Complete Idiot’s Guide to Common Lisp Packages) Vielleicht bringt das etwas Licht ins dunkel. Gruß, Alex ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |