P: qual é a maneira idiomática de mapear uma função em uma lista de propriedades?
As várias funções de mapeamento ( mapcar
e família) mapeiam uma função em uma sequência, como uma lista. Como alguém usa essas funções ao lidar com uma lista de propriedades , ou seja, ao tentar mapear cada uma das propriedades contidas na lista (que seriam todos os outros elementos a partir da primeira)? Parece-me que a função de mapeamento precisaria acessar a lista em pares de elementos, e não como elementos individuais.
Como um exemplo de brinquedo, como alguém pegaria uma lista de propriedades e coletaria todos os valores de propriedades? Se fosse uma lista de associações, seria bem simples:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Tenho certeza que isso pode ser feito com um loop, mas parece um pouco trabalhoso e estou me perguntando se há uma maneira mais idiomática de fazer isso.
mapcar
exemplo atual) ou se deseja mapear os pares de símbolo e valor da propriedade. O último é mais geral (mais útil em geral), eu acho.Respostas:
Você provavelmente obterá várias
loop
respostas de iteração. AFAIK, não há maneira idiomática de fazer isso. Eu nem acho muito comum querer acumular apenas os valores das propriedades (não associá-los às propriedades).Aqui está uma maneira simples de fazer isso:
Para o caso mais geral, onde você deseja mapear uma função binária sobre uma lista:
fonte
Provavelmente isso dependeria de uma situação. Em geral, se eu precisar vincular vários valores a vários nomes, usaria uma tabela de hash, mas, se precisar usar uma lista de propriedades, usaria
cl-loop
. Abaixo estão alguns exemplos:E se você tem uma estrutura de dados, você mostra no seu exemplo:
fonte
Para mim, a resposta é transformar o plist em um alist, que é uma estrutura de dados equivalente, apenas metade da profundidade e mais fácil de manipular.
fonte
Com o Emacs do Git HEAD atual, que se tornará o Emacs 25, você pode fazer o seguinte, ou seja, transformar o plist em um alist facilmente com a nova
seq-partition
função e depois processar as entradas do alist usando o padrãomapcar
.Dê uma olhada nos
seq-partition
documentos usandoC-h f seq-partition RET
.fonte
Uma idéia é usar
-map-indexed
a partirdash
e aplicar a transformação apenas para valores ímpares da lista:Outra idéia é apenas converter um plist para um hash-table, usando
ht<-plist
deht
:Observe que a tabela de hash não preserva a ordem dos itens.
fonte