F: Wie lässt sich eine Funktion idiomatisch auf eine Eigenschaftsliste abbilden?
Die verschiedenen Zuordnungsfunktionen ( mapcar
und die Familie) ordnen eine Funktion über eine Sequenz wie eine Liste zu. Wie verwendet man diese Funktionen, wenn man mit einer Eigenschaftsliste umgeht, dh wenn versucht wird, alle in der Liste enthaltenen Eigenschaften (die jedes andere Element ab dem ersten sein würden) zuzuordnen? Es scheint mir, dass die Zuordnungsfunktion auf die Liste in Paaren von Elementen und nicht als einzelne Elemente zugreifen müsste.
Wie würde man als Spielzeugbeispiel eine Eigenschaftsliste nehmen und alle Eigenschaftswerte sammeln? Wenn es stattdessen eine Assoziationsliste wäre, wäre es ziemlich einfach:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Ich bin mir sicher, dass dies mit einer Schleife möglich ist, aber es scheint ein wenig mühsam zu sein, und ich frage mich, ob es einen idiomatischeren Weg gibt, dies zu tun.
mapcar
Alist-Beispiel tut) oder ob Sie die Paare von Eigenschaftssymbol und Eigenschaftswert abbilden möchten. Letzteres ist allgemeiner (allgemeiner nützlich), würde ich vermuten.Antworten:
Sie erhalten wahrscheinlich verschiedene
loop
und Iterationsantworten. AFAIK, es gibt keine idiomatische Möglichkeit, dies zu tun. Ich denke nicht einmal, dass es üblich ist, nur die Eigenschaftswerte zu akkumulieren (ohne sie mit den Eigenschaften zu verknüpfen).Hier ist eine einfache Möglichkeit:
Für den allgemeineren Fall, dass Sie eine Binärfunktion über eine Plist abbilden möchten:
quelle
Dies würde wahrscheinlich von einer Situation abhängen. Wenn ich eine Anzahl von Werten mit einer Anzahl von Namen verknüpfen muss, würde ich im Allgemeinen eine Hash-Tabelle verwenden, aber wenn ich eine Eigenschaftsliste verwenden muss, würde ich verwenden
cl-loop
. Nachfolgend einige Beispiele:Und wenn Sie eine Datenstruktur haben, zeigen Sie in Ihrem Beispiel:
quelle
Für mich ist die Antwort, die Plist in eine Alist zu verwandeln, die eine äquivalente Datenstruktur darstellt, nur halb so tief und einfacher zu manipulieren ist.
quelle
Mit Emacs aus dem aktuellen Git HEAD, das zu Emacs 25 wird, können Sie Folgendes tun, dh, Sie können die Liste mit der neuen
seq-partition
Funktion auf einfache Weise in eine Liste umwandeln und dann die Listeneinträge mit Standard verarbeitenmapcar
.Schauen Sie sich die
seq-partition
Dokumentation mit anC-h f seq-partition RET
.quelle
Eine Idee ist die Verwendung
-map-indexed
vondash
und anwenden Transformation nur auf ungerade Werte der Liste:Eine weitere Idee ist es , nur eine plist auf eine Hash-Tabelle zu konvertieren, indem
ht<-plist
ausht
:Beachten Sie, dass die Reihenfolge der Elemente in der Hash-Tabelle nicht erhalten bleibt.
quelle