Não encontrei uma função da biblioteca Elisp padrão para mesclar duas listas de propriedades, como esta:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Eu poderia criar algo com dolist
, mas antes de fazer, gostaria de verificar se não estou negligenciando uma função existente em alguma biblioteca.
Atualizações, com base nos comentários :
- Em resposta ao comentário "de várias maneiras":
Eu imaginaria que não existe essa função, porque existem respostas diferentes (e possivelmente válidas) possíveis para a pergunta: o que fazer quando você tem nomes de propriedades duplicados com valores distintos?
Sim, há uma pergunta sobre como mesclar duplicatas, mas existem relativamente poucas maneiras de resolver isso. Eu vejo duas abordagens gerais. Primeiro, a ordem dos argumentos poderia resolver as duplicatas; por exemplo, vitórias mais à direita, como na mesclagem de Clojure . Segundo, a mesclagem pode delegar para uma função de retorno de chamada fornecida pelo usuário, como na mesclagem de Ruby .
De qualquer forma, o fato de existirem diferentes maneiras de fazer isso não impede que muitas outras bibliotecas padrão de idiomas forneçam uma função de mesclagem. O mesmo argumento geral pode ser dito sobre a classificação, e ainda o Elisp fornece a funcionalidade de classificação.
- "Você poderia elaborar?" / "Especifique o comportamento que você está procurando com precisão."
De um modo geral, estou aberto ao que a comunidade Elisp usa. Se você quiser um exemplo específico, aqui está um exemplo que funcionaria:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
E retorna
'(k1 1 k2 2 k3 0))
Esse seria um estilo de vitórias mais à direita, como a mesclagem de Clojure.
- "São listas, então basta acrescentar?"
Não, append
não preserva a semântica da lista de propriedades . Este:
(append '(k1 1 k2 2) '(k2 0))
Retorna isso:
(k1 1 k2 2 k2 0)
append é uma função embutida no `código fonte C '.
(acrescente e descanse SEQUÊNCIAS)
Concatene todos os argumentos e torne o resultado uma lista. O resultado é uma lista cujos elementos são os elementos de todos os argumentos. Cada argumento pode ser uma lista, vetor ou string. O último argumento não é copiado, apenas usado como o final da nova lista.
- "E seu exemplo não mostra nada como uma mesclagem - nem mostra duas listas de propriedades."
Sim; faz a fusão passo a passo. Ele mostra como fazer uma mesclagem usando as funções da lista de propriedades documentadas do Elisp é dolorosamente detalhado:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Basta exibir o valor de saída resultante de pl
:
(key-1 value-1 key-2 value-2)
Para reiterar, sou capaz de escrever uma função para resolver esse problema, mas primeiro queria descobrir se essa função existe em algum lugar de uso comum.
Por fim, se você rebaixou a questão por achar que ela não estava clara, peço que você reconsidere agora que fiz um esforço para esclarecer. Isso não é falta de pesquisa. A documentação do Elisp em "Listas" não responde à pergunta.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
o mesmo (:a 3 :b 2 :a 1)
, desde que você use apenas as funções plist para acessar a lista.
plist-get
nem plist-member
pareça nem se importar se há várias chaves idênticas. Parece que eles se comportam de forma análoga ao alists a este respeito: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Enquanto isso, (plist-put '(:a "a" :b "b" :a "c") :a "d")
substitui o valor da primeira :a
chave, mas não da segunda.
append
?