| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Frage zu vl-sort (1380 / mal gelesen)
|
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 20. Dez. 2016 20:16 <-- editieren / zitieren --> Unities abgeben:
Ich habe ein (möglicherweise nur Verständnis-?)Problem mit vl-sort. Zitat aus der Hilfe: "Duplicate elements may be eliminated from the list." (Ich interpretiere das als: Wenn ein Wert mehrmals vorkommt, taucht er dennoch nur ein Mal in der Ergebnisliste auf.) Dazu nun ein paar Beispiele: 1.: (vl-sort '(1 3 2 4 3 2 1) '< ) => (1 2 3 4) in Ordnung. 2: (auch wenn man hier natürlich kein lambda bräuchte) (vl-sort '(1 2 3 4 1 2 3 5 3 2 1) (function (lambda (e1 e2) (< e1 e2)))) => (1 2 3 4 5) in Ordnung 3.: (vl-sort '((1 3) (2 2) (3 1) (1 4)) (function (lambda (e1 e2) (< (car e1) (car e2))))) => ((1 4) (1 3) (2 2) (3 1)) Da nur nach dem ersten Elemet der Unterlisten sortiert wird, würde ich nur (1 4) oder (1 3) im Ergebnis erwarten. Aber gut, die Unterlisten unterscheiden sich ja im zweiten Element, also nehme ich das mal zähneknirschend zur Kenntnis. 4.: (vl-sort '((1 3) (2 2) (1 3) (3 1) (1 4)) (function (lambda (e1 e2) (< (car e1) (car e2))))) => ((1 3) (1 3) (1 4) (2 2) (3 1)) Das überrascht (mich) nun doch. Sind (1 3) und (1 3) etwa nicht "Duplicate elements"? Kurz: gibt es eine Funktion, die folgendes leistet: Beispiel 3 sortiert nach dem ersten Element der Unterlisten und ignoriert doppelte Vorkommen dieses ersten Elementes, so daß man als Ergebnis entweder ((1 4) (2 2) (3 1)) oder ((1 3) (2 2) (3 1)) (das wäre mir Wursch) erhält? Oder muß man sich da selbst was zusammenstricken?
Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22298 Registriert: 03.06.2002 Alles
|
erstellt am: 20. Dez. 2016 22:01 <-- editieren / zitieren --> Unities abgeben: Nur für jupa
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1991 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 21. Dez. 2016 09:39 <-- editieren / zitieren --> Unities abgeben: Nur für jupa
wenn du doppelte entfernt haben möchtest, würde ich dir besser mal zu vl-remove raten. Da wir ja nicht wissen, was sich die Entwickler bei ihren Funktionen gedacht haben, würde ich pauschal erstmal nur davon ausgehen, das diese nur machen, was deren Funktionsname, in diesem Falle: sortieren, machen. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 21. Dez. 2016 09:51 <-- editieren / zitieren --> Unities abgeben:
Danke für die Hinweise. vl-sort scheint für mein Vorhaben überfordert zu sein (bzw. ich hatte auf Grund der Erläuterungen in der Hilfe zu viel erwartet). Viele andere Wege führen zum Ziel. Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 970 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Dez. 2016 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für jupa
Zitat: Original erstellt von jupa:
3.: (vl-sort '((1 3) (2 2) (3 1) (1 4)) (function (lambda (e1 e2) (< (car e1) (car e2))))) => ((1 4) (1 3) (2 2) (3 1)) Da nur nach dem ersten Elemet der Unterlisten sortiert wird, würde ich nur (1 4) oder (1 3) im Ergebnis erwarten. Aber gut, die Unterlisten unterscheiden sich ja im zweiten Element, also nehme ich das mal zähneknirschend zur Kenntnis.
Warum würdest Du da nur (1 4) oder (1 3) im Ergebnis erwarten? Zitat:
4.: (vl-sort '((1 3) (2 2) (1 3) (3 1) (1 4)) (function (lambda (e1 e2) (< (car e1) (car e2))))) => ((1 3) (1 3) (1 4) (2 2) (3 1)) Das überrascht (mich) nun doch. Sind (1 3) und (1 3) etwa nicht "Duplicate elements"?
Da bist Du auf eine extrem wichtige, aber oft ignorierte Eigenschaft von Lisp gestoßen. Das hat was mit Gleichheit und Identität zu tin. Die beiden Listen '(1 3) und '(1 3) sind zwar gleich, aber nicht identisch. Das sind also so wie eineiige Zwillinge zwei verschiedene Personen. Du kannst das leicht überprüfen: (setq a '(1 3) b '(1 3) c a) (eq a b) ergibt nil, weil a und b nicht identisch sind. (eq a c) ergibt T, weil c dieselbe Liste wie a zugewiesen bekommen hat, und a und c deshalb identisch sind. Intern läuft das so, dass eine Variable nur ein Pointer auf den Variablenwert darstellt. Die beiden Listen '(1 3) (zugewiesen an a) und '(1 3) (zugewiesen an b) sind getrennt voneinander im Speicher abgelegt, und die Variablen zeigen da nur auf zwei verschiedene Listen, die zwar gleich sind, aber eben nicht identisch. Die Variable c aber zeigt auf dieselbe Speicherposition wie die Variable a, also auf exakt dieselbe Liste. Dass oft nicht hinreichend zwischen Gleichheit und Identität unterschieden wird, ist ein häufiger, meist nur sehr schwer zu findender Programmierfehler. Du kannst Dir den Unterschied auch sehr schön anhand der unterschiedlichen Programmierung von Listen und Picksets veranschaulichen. Wenn Du eine Liste hast: (setq lst '(1 2 3)) Und hängst ein Element davor: (cons 0 lst) dann ist die Liste in lst immer noch '(1 2 3). Das wird auch so erwartet, denn diese Liste ist an einer Speicheradresse gespeichert, auf die die Variable lst verweist. Die verweist auch nach der cons-Operation auf diesen Speicherinhalt. Die cons-Operation evaluiert zuerst das Inner des Funktionsaufrufs, gibt also die Liste '(1 3) aus, und hängt die 0 davor. Die ausgegebene Liste '(1 3) ist aber nur gleich mit dem Speicherinhalt, und nicht der Speicherinhalt selbst. Wenn Du ein Pickset hast: (setq sset (ssget)) und dessen Länge prüfst: (sslength sset) Und hängst da ein Element dran: (ssadd (car (entsel) sset) dann hast Du nicht die Ausgabe von sset verändert, sondern den Speicherinhalt von sset. Die Abfrage (sslength sset) zeigt deshalb auch einen größeren Wert als die Abfrage zuvor. Die SSADD Funktion ist also nicht Lisp-gerecht implementiert. Ein guter Lisp-Programmierer wqird deshalb immer lieber mit Listen von Entitynamen arbeiten als mit Picksets. Ein guter AutoLISP- oder VisualLisp-Programmierer darf beides :-) Das ist der Unterschied zwischen Identität und Gleichheit in Lisp. Zukünftig bitte beachten.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6052 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 21. Dez. 2016 17:16 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von archtools:
Warum würdest Du da nur (1 4) oder (1 3) im Ergebnis erwarten? Mein Gedanke war: da ich mich als Sortierkriterium beim Sortieren nur auf das erste Element der Unterlisten beschränke und hier zwei Mal die 1 auftaucht dachte ich, daß in der sortierten Liste evtl. eine der beiden Unterlisten rausfliegt. Inzwischen ist mir klar - ein völlig falscher Gedankengang. Da bist Du auf eine extrem wichtige, aber oft ignorierte Eigenschaft von Lisp gestoßen. Das hat was mit Gleichheit und Identität zu tun.
Genau in diese Richtung hatte ich auch schon vermutet. Da ich aber nicht weiß, ob vl-sort beim Ermitteln der "Duplicate elements" auf Identität oder Gleichheit prüft und ich zugegebenermaßen immer noch Probleme mit dem Unterschied zwischen den beiden habe ... Mein aktuelles Problem habe ich inzwischen anders gelöst (erst alle nicht gewünschten Duplikate entfernen und dann sortieren), aber dennoch vielen Dank für Deine ausführlichen Erläuterungen. Damit kann ich nun (hoffentlich endgültig) eine weitere Unsicherheit im Umgang mit LISP abhaken. Jürgen
------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty)
[Diese Nachricht wurde von jupa am 21. Dez. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 970 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Dez. 2016 20:17 <-- editieren / zitieren --> Unities abgeben: Nur für jupa
Zitat: Original erstellt von jupa:
Genau in diese Richtung hatte ich auch schon vermutet. Da ich aber nicht weiß, ob vl-sort beim Ermitteln der "Duplicate elements" auf Identität oder Gleichheit prüft und ich zugegebenermaßen immer noch Probleme mit dem Unterschied zwischen den beiden habe ... :
Naja, durch Dein Experiment wissen wir jetzt, warum in der Online-Hilfe drin steht "Duplicate elements may be eliminated from the list." "Duplicate elements" meint tatsächlich ein doppelt vorkommendes Element und nicht zwei gleiche Elemente. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|