Supposons que j'ai une liste d'associations comme celle-ci:
(setq x '((foo . ((bar . "llama")
(baz . "monkey")))))
Et je veux la valeur à bar
. Je peux le faire:
(assoc-default 'bar (assoc-default 'foo x))
Mais ce que j'aimerais vraiment, c'est quelque chose qui accepte plusieurs clés, comme
(assoc-multi-key 'foo 'bar x)
Une telle chose existe-t-elle, peut-être dans un paquet quelque part? Je suis sûr que je pourrais l'écrire, mais j'ai l'impression que mon Google-fu échoue et que je ne le trouve pas.
elisp
association-lists
abingham
la source
la source
assoc-multi-key
. Vraisemblablement, il recherche des correspondances avec ses deux premiers arguments, mais c'est vraiment tout ce que l'on peut supposer, d'après ce que vous avez dit. Et il ne peut clairement pas accepter plus de deux clés, puisque l'argument alist (vraisemblablementx
) est le dernier, pas le premier - ce qui suggère qu'il n'est pas trop utile en général. Essayez de spécifier ce que vous recherchez.setq
formulaire dans l'exemple confus, donc je l'ai édité pour utiliser la notation par points commune pour les listes d'associations.assoc-multi-key
reste non spécifiée.assoc-multi-key
est de rechercher la première clé de la liste d'associations. Cela devrait résoudre une nouvelle liste d'associations dans laquelle nous recherchons la clé suivante. Et ainsi de suite. Fondamentalement, un raccourci pour creuser des valeurs dans des listes d'associations imbriquées.let-alist
aussi le mentionner ? par exemple(let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)
reviendra"llama"
. Je suppose que vous avez écritlet-alist
après que la question a été posée, mais c'est dans l'esprit de la question et ça vaut vraiment la peine de mentionner IMO!Réponses:
Voici une option qui prend la syntaxe exacte que vous avez demandée mais de manière généralisée et qui est assez simple à comprendre. La seule différence est que le
ALIST
paramètre doit venir en premier (vous pouvez l'adapter pour qu'il arrive en dernier, si cela est important pour vous).Ensuite, vous pouvez l'appeler avec:
la source
Voici une solution plus générique:
Il peut prendre n'importe quel "chemin" de clés. Cela reviendra
(bar . "llama")
alors que cela reviendra
(baz . "monkey")
:la source
Voici une fonction simple qui fonctionne avec une liste imbriquée dans une autre liste:
la source