Non ho trovato una funzione di libreria Elisp standard per unire due elenchi di proprietà, in questo modo:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Potrei costruire qualcosa con dolist
, ma prima di farlo, vorrei verificare che non sto trascurando una funzione esistente in qualche libreria.
Aggiornamenti, basati sui commenti :
- In risposta al commento "molti modi":
Immagino che non ci sia una tale funzione perché ci sono risposte diverse (e forse valide) alla domanda: cosa fare quando si hanno nomi di proprietà duplicati con valori distinti?
Sì, c'è una domanda su come unire i duplicati, ma ci sono relativamente pochi modi per affrontarlo. Vedo due approcci generali. Innanzitutto, l'ordine degli argomenti potrebbe risolvere i duplicati; es. vince all'estrema destra, come nella fusione di Clojure . In secondo luogo, l'unione potrebbe delegare a una funzione di richiamata fornita dall'utente, come nell'unione di Ruby .
In ogni caso, il fatto che ci siano diversi modi per farlo non impedisce a molte altre librerie standard di lingue di fornire una funzione di unione. Lo stesso argomento generale si potrebbe dire dell'ordinamento, eppure Elisp fornisce funzionalità di ordinamento.
- "Potresti elaborare?" / "Specifica con precisione il comportamento che stai cercando."
In generale, sono aperto a ciò che utilizza la comunità Elisp. Se desideri un esempio specifico, ecco un esempio che funzionerebbe:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
E ritorna
'(k1 1 k2 2 k3 0))
Questo sarebbe uno stile vincente all'estrema destra, come l'unione di Clojure.
- "Sono liste, quindi basta aggiungere?"
No, append
non conserva la semantica dell'elenco delle proprietà . Questo:
(append '(k1 1 k2 2) '(k2 0))
Restituisce questo:
(k1 1 k2 2 k2 0)
append è una funzione integrata in "codice sorgente C".
(aggiungere e riposare SEQUENZE)
Concatena tutti gli argomenti e trasforma il risultato in un elenco. Il risultato è un elenco i cui elementi sono gli elementi di tutti gli argomenti. Ogni argomento può essere un elenco, un vettore o una stringa. L'ultimo argomento non viene copiato, utilizzato solo come coda del nuovo elenco.
- "E il tuo esempio non mostra nulla di simile a un'unione - non mostra nemmeno due elenchi di proprietà."
Sì lo fa; fa l'unione passo dopo passo. Mostra come eseguire un'unione usando le funzioni dell'elenco delle proprietà documentate di Elisp sia penosamente prolisso:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Visualizza semplicemente il valore di output risultante da pl
:
(key-1 value-1 key-2 value-2)
Per ribadire, sono in grado di scrivere una funzione per risolvere questo problema, ma prima volevo capire se una tale funzione esiste da qualche parte nell'uso comune.
Infine, se hai annullato la votazione della domanda perché l'hai trovata poco chiara, ti chiederei di riconsiderare ora che ho fatto qualche sforzo per chiarire. Questa non è una mancanza di ricerca. La documentazione Elisp su "Elenchi" non risponde alla domanda.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
che è lo stesso (:a 3 :b 2 :a 1)
fintanto che usi solo le funzioni di plist per accedere alla plist.
plist-get
ne plist-member
sembrano preoccuparsi se ci sono più chiavi identiche. Sembra che si comportano in modo analogo a alists a questo riguardo: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Nel frattempo, (plist-put '(:a "a" :b "b" :a "c") :a "d")
sostituisce il valore della prima :a
chiave ma non della seconda.
append
?