Ich habe keine Standardfunktion für die Elisp-Bibliothek gefunden, mit der zwei Eigenschaftslisten wie folgt zusammengeführt werden können:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Ich könnte etwas damit bauen dolist
, aber bevor ich es tue, möchte ich überprüfen, ob ich eine vorhandene Funktion in einer Bibliothek nicht übersehen kann.
Updates, basierend auf den Kommentaren :
- Als Antwort auf den Kommentar "Vielseitigkeit":
Ich würde mir vorstellen, dass es eine solche Funktion nicht gibt, weil es unterschiedliche (und möglicherweise gültige) Antworten auf die Frage gibt: Was tun, wenn Sie doppelte Eigenschaftsnamen mit unterschiedlichen Werten haben?
Ja, es gibt eine Frage zum Zusammenführen von Duplikaten, aber es gibt relativ wenige Möglichkeiten, dies zu beheben. Ich sehe zwei allgemeine Ansätze. Erstens könnte die Argumentreihenfolge die Duplikate auflösen. zB gewinnt ganz rechts, wie bei Clojures Fusion . Zweitens könnte die Zusammenführung an eine vom Benutzer bereitgestellte Rückruffunktion delegieren, wie bei Rubys Zusammenführung .
In jedem Fall hindert die Tatsache, dass es verschiedene Möglichkeiten gibt, dies zu tun, viele andere Sprachstandardbibliotheken nicht daran, eine Zusammenführungsfunktion bereitzustellen. Das gleiche allgemeine Argument könnte für das Sortieren gelten, und dennoch bietet Elisp Sortierfunktionen.
- "Könnten Sie näher darauf eingehen?" / "Bitte geben Sie das gesuchte Verhalten genau an."
Generell bin ich offen für das, was die Elisp-Community nutzt. Wenn Sie ein bestimmtes Beispiel wünschen, wäre hier ein Beispiel, das funktionieren würde:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
Und kehrt zurück
'(k1 1 k2 2 k3 0))
Dies wäre ein Stil, der ganz rechts gewinnt, wie die Fusion von Clojure.
- "Das sind Listen, also einfach anhängen?"
Nein, append
die Semantik der Eigenschaftsliste wird nicht beibehalten . Dies:
(append '(k1 1 k2 2) '(k2 0))
Gibt Folgendes zurück:
(k1 1 k2 2 k2 0)
append ist eine integrierte Funktion im C-Quellcode.
(Anhängen und Ausruhen SEQUENZEN)
Verketten Sie alle Argumente und machen Sie das Ergebnis zu einer Liste. Das Ergebnis ist eine Liste, deren Elemente die Elemente aller Argumente sind. Jedes Argument kann eine Liste, ein Vektor oder eine Zeichenfolge sein. Das letzte Argument wird nicht kopiert, sondern nur als Ende der neuen Liste verwendet.
- "Und Ihr Beispiel zeigt nichts wie eine Zusammenführung - es zeigt nicht einmal zwei Eigenschaftslisten."
Ja tut es; Die Zusammenführung erfolgt Schritt für Schritt. Es zeigt, wie schmerzhaft das Zusammenführen mit den dokumentierten Eigenschaftenlistenfunktionen von Elisp ist:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Zeigen Sie einfach den resultierenden Ausgabewert an von pl
:
(key-1 value-1 key-2 value-2)
Um es noch einmal zu wiederholen, ich bin in der Lage, eine Funktion zu schreiben, um dieses Problem zu lösen, aber ich wollte zuerst herausfinden, ob eine solche Funktion irgendwo allgemein gebräuchlich ist.
Wenn Sie die Frage abgelehnt haben, weil Sie sie unklar fanden, würde ich Sie bitten, sie jetzt zu überdenken, da ich mich bemüht habe, sie zu klären. Dies ist kein Mangel an Forschung. Die Elisp-Dokumentation zu "Listen" beantwortet die Frage nicht.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
Dies ist dieselbe, (:a 3 :b 2 :a 1)
solange Sie nur Plist-Funktionen verwenden, um auf die Plist zuzugreifen.
plist-get
noch wichtig zu sein plist-member
scheint, ob es mehrere identische Schlüssel gibt. Es sieht so aus, als würden sie sich in dieser Hinsicht analog zu Alisten verhalten : (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. (plist-put '(:a "a" :b "b" :a "c") :a "d")
Ersetzt in der Zwischenzeit den Wert des ersten :a
Schlüssels, nicht jedoch des zweiten.
append
?