| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo |
| |
 | Windows Server 2025 - Was ist neu im Microsoft Server-Betriebssystem, eine Pressemitteilung
|
Autor
|
Thema: LISP: Variablenname im Code erzeugen (2129 mal gelesen)
|
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 20. Apr. 2011 13:43 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habe in einem Dialog mehrere Variable die mit laufenden Nummern versehen sind. Diesen Variablen werden im Prinzip immer mit dem selben Code Werte zugewiesen oder abgefragt.
Code:
:variables '( (Var-1-test :value-type :length) (Var-2-test :value-type :length) (Var-3-test :value-type :length) )
Um Codezeilen zu sparen dachte ich mir, ich könnte diese Variablen mittels
Code: (setf var (read-from-string (format nil "Var-~a-test" counter)))
im Code erzeugen. Ich bekomme da zwar ein Symbol, aber wie bekomme ich den Wert der entsprechenden Dialogvariable bzw. wie kann ich dieser einen Wert zuweisen?Funktioniert das auf diese Art und Weise überhaupt oder liege ich komplett falsch? ------------------ Gruß aus dem Salzkammergut Thomas 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: 20. Apr. 2011 20:18 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
|
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 21. Apr. 2011 07:32 <-- editieren / zitieren --> Unities abgeben:         
Hallo claus, Zitat: Original erstellt von clausb: Zuweisen eines Wertes an das neu erzeugte Symbol: (setf (symbol-value var) 42)
funktioniert mit globalen Variablen (mit defvar erzeugt), prima, aber nicht mit Dialogvariablen oder mit lokalen Variablen. Zitat: Auszug aus Lispworks CLHS: Notes: symbol-value can be used to get the value of a constant variable. symbol-value cannot access the value of a lexical variable.
Gensym ist auch nicht das richtige. Ich will ja eigentlich kein neues Symbol erzeugen, sondern im Code nur den Namen der verwendeten Variable dynamisch erzeugen um der bereits existierenden Variable einen Wert zuzuweisen oder diesen zu bekommen. ------------------ Gruß aus dem Salzkammergut Thomas 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: 21. Apr. 2011 13:28 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Auch mit lokalen Variablen geht das: Code:
(defun foo() (let ((sym (read-from-string "mysym"))) (setf (symbol-value sym) 42) (print (symbol-value sym))))
Aber wie auch immer - das war nur als Inspiration gedacht, in der Hoffnung, dass es Dich auf eine Idee bringt. Eine echte Lösung kann ich nicht anbieten, weil ich die beabsichtigte Anwendung vermutlich nicht wirklich verstanden habe. ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 22. Apr. 2011 11:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo, mit lokalen Variablen scheints wirklich zu funktionieren, aber auf Dialogvariablen kann ich auf diese Weise innerhalb der local-functions nicht zugreifen. Vielleicht nochmal zur Erklärung: Ich baue einen Dialog, mit einigen Variablen, die durchnummeriert werden:
Code: :variables '( (Var-1 :value-type :length) (Var-2 :value-type :length) (Var-3 :value-type :length) ... (Var-16 :value-type :length) )
In den local-functions werden die Werte dieser Variablen abgefragt und ev. mit neuen Werten gefüttert. Damit ich den gleichen Code nicht für jede Variable extra schreiben muss, möchte ich in einer dotimes Schleife die Variablennamen erzeugen und dann damit arbeiten. statt Code:
(tu-was () (tu-irgendwas-mit var-1) (tu-irgendwas-mit var-2) (tu-irgendwas-mit var-3) ... (tu-irgendwas-mit var-16))
möchte ich:Code:
(tu-was () (dotimes (counter 16) (setf var (read-from-string (format nil "Var-~a" counter))) (tu-irgendwas-mit var)))
Ich habe mir auch schon überlegt, ob ich eine Liste oder ein Array erzeugen soll, wohin die Werte der Dialogvariablen "kopiert" werden. Das hat aber den Nachteil, dass ich eine eigene Funktion bauen muss, die die Werte von den Dialogvariablen in die Liste oder das Array kopiert und bei Änderungen wieder zurückkopiert. ------------------ Gruß aus dem Salzkammergut Thomas 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: 26. Apr. 2011 18:45 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Zitat: Original erstellt von holt: mit lokalen Variablen scheints wirklich zu funktionieren, aber auf Dialogvariablen kann ich auf diese Weise innerhalb der local-functions nicht zugreifen.
Kann gut sein. "Dialogvariablen" werden in sd-defdialog ganz speziell behandelt. Eventuell helfen Dir die Dialoggenerator-Funktionen sd-get-variable-status und sd-set-variable-status weiter, siehe IKIT-Dokumentation. Wenn Du was von Lisp-Makroprogrammierung verstehst, wäre eine einfache Alternative, sich ein Lisp-Makro zu schreiben, das in einen sd-defdialog-Aufruf expandiert. Claus
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ 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: 26. Apr. 2011 20:38 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Oha... Also sd-defdialog ist ja nun selbst ein LISP Macro....
Ich habe mal einen macro drum rumgeschrieben, das den macro aufruft.. aber das ganze wird dann u.U. schon ziemlich lustig mit quote, backquote, aber insbesondere auch mit der Verwendung von @. Und mit @ koennte es funktionieren. Denn so habe ich mir extern eine Liste erzeugt und diese mit @.... irgendwas in den sd-defdialog geschleust. Aber das ist schon alles sehr lange her und mein Gedächtnis weist erhebliche Lücken auf. Eine andere Variante ist: definiere 10 (oder 5) variablen FIX und 'mappe' die gesamt liste 'page'-weise auf diese 5 Variablen. Einen solchen 'Blätter' mechanismus kann man bei im Annotation bei Mi-file-based symbolen mit 20..30.. Variablen sehen. Guck dir mal sd-doc3d-create-symbol-dialog mit der :install-function an. Vielleicht erleuchtet es uns. ------------------ ● Seamonkey Firefox Thunderbird ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● 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: 26. Apr. 2011 21:11 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
Zitat: Original erstellt von der_Wolfgang: Oha... Also sd-defdialog ist ja nun selbst ein LISP Macro....
Das ist gar kein Problem. Sieht man schon daran, dass in vielen Lisp-Implementierungen (unless) ein Makro ist, und das kann man wiederum natürlich problemlos auch innerhalb anderer Makros verwenden - beispielsweise in einem Aufruf von sd-defdialog. Hintergrundmaterial zu Makros:
[Diese Nachricht wurde von clausb am 26. Apr. 2011 editiert.] 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: 02. Mai. 2011 20:01 <-- editieren / zitieren --> Unities abgeben:          Nur für holt
|
holt Mitglied Systembetreuer CAD
  
 Beiträge: 720 Registriert: 07.08.2003 Lenovo ThinkStation P360 Core i7-12700@2.10 GHz, 32GB NVIDIA RTX A2000 12 GB Creo Elements/Direct Modeling 20.5 Creo Elements/Direct Drafting 20.5 Creo Elements/Direct ModelManager 20.5
|
erstellt am: 21. Jun. 2011 15:49 <-- editieren / zitieren --> Unities abgeben:         
Danke für eure Beiträge, dadurch (und mithilfe unseres ausgezeichneten Supports) bin ich zu der Erkenntnis gekommen, dass ein wenig mehr Code besser ist als solche unschönen Konstrukte. Zitat: Original erstellt von clausb:Hört sich eher fischig an.
P.S.: Tut mir leid, dass ich mich so lange nicht gemeldet habe, war aber in letzter Zeit mit anderem beschäftigt und es hat doch eine zeitlang gedauert bis ich mich wieder in die Materie hineingearbetet habe um zu der Erkenntnis zu kommen ------------------ Gruß aus dem Salzkammergut Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |