| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | Exklusives EDU-Programm für RTX PRO Blackwell, eine Pressemitteilung
|
Autor
|
Thema: Schon wieder mapcar (1150 mal gelesen)
|
Dea Mitglied
 
 Beiträge: 155 Registriert: 23.10.2002 ACAD 2006, ACAD 2007 ADT 2006 sp1
|
erstellt am: 25. Jun. 2003 12:31 <-- editieren / zitieren --> Unities abgeben:         
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
 
 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 / zitieren --> Unities abgeben:          Nur für Dea
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
       

 Beiträge: 4201 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 25. Jun. 2003 15:44 <-- editieren / zitieren --> Unities abgeben:          Nur für Dea
|
mapcar Mitglied CADmin

 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 / zitieren --> Unities abgeben:          Nur für Dea
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
 
 Beiträge: 155 Registriert: 23.10.2002 ACAD 2006, ACAD 2007 ADT 2006 sp1
|
erstellt am: 27. Jun. 2003 08:14 <-- editieren / zitieren --> Unities abgeben:         
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 |