Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Variablenname als Parameter mitgeben

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:  Variablenname als Parameter mitgeben (498 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: 01. Sep. 2009 11:09    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

Ich möchte eine Nebenroutine schreiben, die als Parameter nicht nur die Ausgangswerte, sondern auch den Namen des Zielwertes enthält:

Beispiel (funktioniert aber nicht):

Code:
(defun mal (a b c)
    (setq c (* a b))
)

Ich starte mit

Code:
(mal 5 3 Wert1)

und das Programm rechnet mit
Code:
(setq wert1 (* 5 3)
und am Schluss ist in der Variable Wert1 die Zahl 15 gespeichert.

Und dann geht es weiter mit

Code:
(mal 12.3 18.5 Wert2)

usw.

Ich bedanke mich für Tipps zu einem funktionierendem Code.

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 01. Sep. 2009 11:21    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

Zitat:
Original erstellt von Peter2:
Ich möchte eine Nebenroutine schreiben, die als Parameter nicht nur die Ausgangswerte, sondern auch den Namen des Zielwertes enthält:

Beispiel (funktioniert aber nicht):

Code:
(defun mal (a b c)
    (setq c (* a b))
)

...

Hallo Peter,

mit einer minimalen Änderung, kannst du das Ziel erreichen:

Code:
(defun mal (a b c)
  (set c (* a b))
  )
(mal 10.0 2.0 'd)
(princ d)

Bei Fragen ...

Grüße!

Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 01. Sep. 2009 11:22    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

(defun MAL (A B VARNAME)
  (if(and (numberp A)
          (numberp B)
          (or(=(type VARNAME)'STR)
            (=(type VARNAME)'SYM)
          )
    )
    (cond
      ((=(type VARNAME)'STR)
      (set (read VARNAME)(* A B))
      )
      ((=(type VARNAME)'SYM)
      (set VARNAME (* A B))
      )
    )
  )
)


(MAL 4 5 'DDD)
oder
(MAL 4 5 "DDD")

sollten funktionieren

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 01. Sep. 2009 11: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 Nur für Peter2 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Peter2:
Ich möchte eine Nebenroutine schreiben, die als Parameter nicht nur die Ausgangswerte, sondern auch den Namen des Zielwertes enthält:

Beispiel (funktioniert aber nicht):

Code:
(defun mal (a b c)
    (setq c (* a b))
)

...

Hallo Peter,
eine Anmerkung zur Sinnhaftigkeit deines Vorhabens:
Ich habe in meiner doch recht langen Zeit des Programmierens noch nicht den Fall erlebt, dass ich auf diesem Weg Variablen Werte zuweisen muss.

In aller Regel sollte man die SUB-Funktion dann doch so gestalten, dass diese ein Ergebnis liefert:
(defun mal (a b / erg)
(setq erg (* a b))
erg
)
...
(setq Wert1 (mal 10.0 2.0))
...

Das ist sauber und lässt auch in 2 Jahren den Programmierer verstehen, warum die Variable Wert1 an dieser Stelle des Codes den Wert 20.0 enthält.

Ich kenne nun den Zusammenhang nicht, möchte dir dennoch empfehlen, dein Vorhaben noch einmal zu überdenken!

Bei Fragen ...

Grüße!
Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

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: 01. Sep. 2009 11:38    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

Danke an beide   

@Holger - 1:
ja, die kleinen Strichlein '' und set statt setq - das ist immer dann ganz logisch, wenn man es bei anderen liest.

@cadmium:
Danke, eine sehr grundsätzliche Lösung.

@Holger - 2:
Ja, da liegt mein Ansatz doch sehr quer im Raum. Da habe ich mich ein wenig verlaufen.

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 01. Sep. 2009 11:39    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

zum Thema Variablenübergabe:

wenn eine Unterfunktion mehrere Werte zurückliefern soll, dann kann man die in eine Liste packen

(defun TESTUS (/ A B C)
  (list
    (setq A 1)
    (setq B "TEST")
    (setq C '(1 . "AB"))
  )       
)

im Hauptprogramm werden dann die Variablen D E F mit den Werten von Sub-A , Sub-B Sub-C wie folgt initialisiert :

(mapcar
  '(lambda(X Y)(set X Y))
  '(D E F)
  (TESTUS)
)


nur mal am Rande

------------------
  - Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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: 01. Sep. 2009 11: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

Danke an beide     

@Holger - 1:
ja, die kleinen Strichlein '' und set statt setq - das ist immer dann ganz logisch, wenn man es bei anderen liest.

@cadmium:
Danke, eine sehr grundsätzliche Lösung.

@Holger - 2:
Ja, da liegt mein Ansatz doch sehr quer im Raum. Da habe ich mich ein wenig verlaufen.
(Eigentlich war der Ansatz der, dass das Ergebnis recht gross und recht häufig auftritt. Daher dachte ich, nicht "einheitlich ausrechnen und dann mit setq aufteilen", sondern schon beim ausrechnen gleich zuweisen - Reduzierung Rechnerlast?). Aber das ist eher Spielerei ...

Peter

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

[Diese Nachricht wurde von Peter2 am 01. Sep. 2009 editiert.]

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

Geos
Mitglied
Vermessungstechniker i.R.


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

Beiträge: 1017
Registriert: 21.09.2001

ACAD Map 2010, Win 7 Pro
eigene Lisp's<P>HW: Core i7 860, 2.8 GHz
3.3 GB, NVIDIA GeForce GTS 250

erstellt am: 01. Sep. 2009 17:25    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

Zitat:
...noch nicht den Fall erlebt, dass ich auf diesem Weg Variablen Werte zuweisen muss.

Vielleicht nicht "muss", aber zu "kann" fiele mir schon was ein - z.B.:
Wenn das Programm wert1, wert2, usw. hochzählt, aber das Ende nicht bekannt,
bzw. das Progr. die Var.Namen - aus irgendwelchen Ergebnissen - selbst bildet/zusammensetzt?

Aber fragt mich jetzt nicht um ein konkretes Beispiel ... 

------------------
Schöne Grüße
Ernst

www.geopaint.at

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

archtools
Mitglied



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

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 01. Sep. 2009 23:39    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

Zitat:
Original erstellt von Brischke:
Hallo Peter,
eine Anmerkung zur Sinnhaftigkeit deines Vorhabens:
Ich habe in meiner doch recht langen Zeit des Programmierens noch nicht den Fall erlebt, dass ich auf diesem Weg Variablen Werte zuweisen muss.

Hallo Holger,

ich mache das gar nicht selten, dass ich Funktionsnamen und Variablennamen als Symbole in anderen Variablen speichere, wenngleich natürlich nicht auf dieselbe Art wie in diesem Beispiel. Damit kann man äußerst elegante Code-Abkürzungen erreichen.

Als Beispiel möge diese Funktion dienen, die genau so wie MAPCAR für Listen eine Funktion auf jedes Element eines Auswahlsatzes anwendet:

Code:

(defun mapent (fun ss / i)
  (repeat (setq i (sslength ss))
    ((lambda (proc args / ss fun i)
      (apply proc args)
    )
      fun
      (list (ssname ss (setq i (1- i))))
    )
  )
)

So wie bei MAPCAR meist eine mit LAMBDA definierte temporäre Funktion auf eine Liste angewendet wird, wird hier eine Funktion an die Variable FUN in MAPENT übergeben, das diese dann elegant an die Variable PROC in der Lambda-Funkltion weiter reicht, die diese Funktion dann mit APPLY anwendet.


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: 02. Sep. 2009 00:09    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 Geos:
...Wenn das Programm wert1, wert2, usw. hochzählt, aber das Ende nicht bekannt, bzw. das Progr. die Var.Namen - aus irgendwelchen Ergebnissen - selbst bildet/zusammensetzt?...

Ich habe diese Frage mit Listen gelöst - da kann man immer den Werten beliebige Zähler oder selbsterzeugte Namen mitgeben. Alles recht schnell und mit den Listenfunktionen gut bearbeitbar.

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 02. Sep. 2009 10:30    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 hatte einmal den Fall, dass ich errechnete Variablennamen verwendete. Ist zwar meist unsauber programmiert, aber da es lediglich ein einmaliges Konvertierungstools war, war es mir egal

Das macht man folgenderweise :

(SETQ Variablenname "WERT1")

(SET (read variablenname) 55)

(print (eval (read variablenname))) ; -> 55

(print wert1) ; -> 55

[Diese Nachricht wurde von fuchsi am 02. Sep. 2009 editiert.]

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

archtools
Mitglied



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

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 02. Sep. 2009 12:15    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

Zitat:
Original erstellt von fuchsi:
ich hatte einmal den Fall, dass ich errechnete Variablennamen verwendete. Ist zwar meist unsauber programmiert, aber da es lediglich ein einmaliges Konvertierungstools war, war es mir egal

Bei meiner Nachprogrammierung von GEOMCAL letztes Wochenende habe ich sogar einer Variablen sich selbst zugewiesen, also z.B. (setq var 'var). Und ohne in Details zu gehen: unsauber programmiert war das ganz und gar nicht :-)

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

Brischke
Moderator
CAD on demand GmbH




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 03. Sep. 2009 08:15    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

Hallo,

klar arbeite ich auch mit der Übergabe von Funktionen an irgendwelche Funktionshüllen (Bsp von archtools). Das macht auch absolut Sinn - keine Frage. Hat man dieses Thema verinnerlicht, ergeben sich natürlich enorme Möglichkeiten der Code-Verkürzung.
Nur so, wie das Bsp hier war, ist es mir noch nicht unter gekommen und halte ich es auch nicht für sinnig.

Grüße Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

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