Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Schon wieder mapcar

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:  Schon wieder mapcar (1042 mal gelesen)
Dea
Mitglied



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

Beiträge: 155
Registriert: 23.10.2002

ACAD 2006, ACAD 2007
ADT 2006 sp1

erstellt am: 25. Jun. 2003 12:31    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

Hilfe!

Jetzt habe ich mir auch Ärger mit mapcar, dem Befehl, aufgehalst. Ich habe wieder versucht, die Autolisp-Seiten weiter durchzuarbeiten. Als Beispiel für mapcar und lambda wollte ich die Koordinaten eines Umfassungsquaders im 3D ermitteln.

Der erste Versuch noch ohne die beiden Befehle zur Ermittlung des Punktes mit den größten Koordinaten hat ja noch funktioniert.

(defun Aussen1 (punktliste / pmax pmin)
  (setq pmax (list
      (max (car (car punktliste)) (car (cadr punktliste)) (car (caddr punktliste)))
      (max (cadr (car punktliste)) (cadr (cadr punktliste)) (cadr (caddr punktliste)))
      (max (caddr (car punktliste)) (caddr (cadr punktliste)) (caddr (caddr punktliste)))
    )
  )
)

Dann wollte ich die list-Konstruktion durch mapcar und lambda ersetzen.

  (setq pmax (mapcar
      '(lambda (xyz)
          (max (xyz (car punktliste)) (xyz (cadr punktliste)) (xyz (caddr punktliste)))
        )
      '(car cadr caddr)
    )
  )

Das Problem liegt bei (xyz (car punktliste)). Hier bekomme ich immer die Meldung Fehler: Fehlerhafte Funktion: CAR. Wenn ich aber xyz mit setq auf car setze funktioniert die Anweisung. Was hat's da?


Dea

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

Ulf Böger
Mitglied



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

Beiträge: 281
Registriert: 18.09.2002

IBM R50p 1.7GHz 1GB RAM
ATI Mobility Fire GL T2 128 MB
Win2000 SP3
AutoCAD Mechanical 2004 DX
Inventor 8 SP1
ADT 2004
PartSolutions 8

erstellt am: 25. Jun. 2003 14:54    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 Dea 10 Unities + Antwort hilfreich

Hi Dea,
ich kann nicht ganz folgen. Ist das So zu deuten:
      '(lambda (xyz)
          (max (xyz (car punktliste)) ...
du definiertst die Funktion xyz und ruftst diese mit dem Paramater (car punktliste) auf? Davon suchst du dann das Maximum. Irgendwas fehlt hier. Von was suchst du das Maximum überhaupt? Sind in der Punktliste folgende Werte z.B. ((1 2 3) (2 5 3) ...)

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: 25. Jun. 2003 15:44    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 Dea 10 Unities + Antwort hilfreich

Hallo Dea,

ich würde so nicht rangehen. Bei mürde das spontan so aussehen:

Code:

(defun aussen1 (ptl /)
  (mapcar 'car
          (list
            (vl-sort (mapcar 'car ptl) '> )
            (vl-sort (mapcar 'cadr ptl) '> )
            (vl-sort (mapcar 'caddr ptl) '> )
            )
          )
  )


Dein Konstrukt lässt sich nur auf eine Liste mit 3 Punkten anwenden. Hast Du aber immer nur 3?
(vielleicht fällt mir ja noch was ein?)

@Ulf,

zum mapcar '(lambda gab's hier in den Foren schon sehr viele Ausführungen. Schau mal unter den folgenden Links
http://ww3.cad.de/foren/ubb/Forum145/HTML/000037.shtml http://ww3.cad.de/foren/ubb/Forum145/HTML/000094.shtml

Noch ganz kurz:
eine '(lambda-Funktion hat keinen Namen in den Klammern danach werden wie beim (defun nur die Variablen deklariert.

Bei Fragen ...

Grüße Holger

------------------
Holger Brischke
CADlon - Lisp over night!
4 Neue Tool's im FreeDownload(gesamt 33)!?

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: 25. Jun. 2003 16:06    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 Dea 10 Unities + Antwort hilfreich

Hallo Dea,

der Ansatz ist super (das ist Lisp, kein Basic!) - nur ein kleiner Haken bei der Ausführung: Da ist eine Evaluationsstufe zu wenig im Spiel.

CAR evaluiert zu #<SUBR @027eef8c CAR> - und das ist das, was da gebraucht wird (in XYZ), nicht der Name CAR, sondern der Funktionsinhalt. Ändere '(car cadr caddr) in (list car cadr caddr) um, dann geht's, weil dann nicht die Namen, sondern die evaluierten Inhalte an mapcar durchgereicht werden.

Code:

(setq punktliste '((1 6 3)(2 5 7)(9 4 6)))


(mapcar
'(lambda (xyz)
    (max (xyz (car punktliste)) (xyz (cadr punktliste)) (xyz (caddr punktliste)))
  )
  (list car cadr caddr)
)


Aber es lässt sich noch einiges vereinfachen und verbessern. Warum auf drei Punkte beschränken? Ist doch schöner, wenn's mit jeder Punktliste funktioniert. Und gleich noch MIN und MAX in einem Rutsch erledigen:

Code:

(setq punktliste '((1 6 3)(2 5 7)(9 4 6)))

(mapcar
'(lambda(extr / )
    (mapcar
    '(lambda(cxr / )
        (apply extr
          (mapcar cxr punktliste)
        )
      )
    '(car cadr caddr)
    )
  )
'(min max)
)

=> ((1 4 3)(9 6 7))


In diesem Fall musst du aber wieder die Funktionsnamen übergeben, nicht die Funktionen selbst. Sowohl APPLY als auch MAPCAR ohne LAMBDA erwarten Funktionsnamen, nicht die Funktionen.

Gruss, Axel

------------------

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

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

Dea
Mitglied



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

Beiträge: 155
Registriert: 23.10.2002

ACAD 2006, ACAD 2007
ADT 2006 sp1

erstellt am: 27. Jun. 2003 08:14    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

Hallo!

Zuerst einmal Danke an alle die geantwortet haben.

@Holger: Deine Lösung schaut gut aus. Den Befehl vl-sort kannte ich noch nicht.

@mapcar: Danke, genau das mit der Evaluationsstufe war's.

Den Umbau zu mehr als drei Punkten hatte ich vor. Wenn ich keine akute Problemstellung zu lösen habe sondern nur am Üben bin wähle ich eher die Taktik der kleinen Schritte und bastle in meheren Etappen an meinen Beispielen herum. Hier war das Hauptversuchsfeld einfach nur die Anwendung von mapcar und lambda.

mfg

Dea

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