Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Frage zu vl-sort

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
  
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


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

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 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 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
良い精神




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

Beiträge: 22298
Registriert: 03.06.2002

Alles

erstellt am: 20. Dez. 2016 22:01    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 jupa 10 Unities + Antwort hilfreich

may be
KANN SEIN

Wie selbst schon festgestellt hast: Mal so und mal so,
In Abhängigkeit der Vergleichsfunktion.

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

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

CADwiesel
Moderator
CAD4FM UG




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

Beiträge: 1991
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 21. Dez. 2016 09: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 jupa 10 Unities + Antwort hilfreich

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


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

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 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 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



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: 970
Registriert: 09.10.2004

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

erstellt am: 21. Dez. 2016 15:59    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 jupa 10 Unities + Antwort hilfreich

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


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

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 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 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



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: 970
Registriert: 09.10.2004

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

erstellt am: 21. Dez. 2016 20:17    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 jupa 10 Unities + Antwort hilfreich

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 >>)

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)2024 CAD.de | Impressum | Datenschutz