Suponha que eu tenha uma lista assoc como esta:
(setq x '((foo . ((bar . "llama")
(baz . "monkey")))))
E eu quero o valor em bar
. Eu posso fazer isso:
(assoc-default 'bar (assoc-default 'foo x))
Mas o que eu realmente gostaria é algo que aceite várias chaves, como
(assoc-multi-key 'foo 'bar x)
Existe algo assim, talvez em um pacote em algum lugar? Tenho certeza de que poderia escrever, mas sinto que meu Google-fu está falhando e não consigo encontrá-lo.
elisp
association-lists
Abingham
fonte
fonte
assoc-multi-key
. Presumivelmente, ele procura correspondências para os dois primeiros argumentos, mas isso é tudo o que se poderia supor, pelo que você disse. E claramente não pode aceitar mais de duas chaves, uma vez que o argumento alista (presumivelmentex
) é o último, não o primeiro - o que sugere que não é muito útil em geral. Tente realmente especificar o que você está procurando.setq
formulário no exemplo confusa, por isso editei-a para usar a notação de ponto comum para assoc-lists.assoc-multi-key
permanece não especificada.assoc-multi-key
é procurar a primeira chave na lista assoc. Isso deve resolver para uma nova lista assoc na qual procuramos a próxima chave. E assim por diante. Basicamente, é uma abreviação para extrair valores de listas associadas aninhadas.let-alist
também? por exemplo(let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)
, retornará"llama"
. Eu acho que você escreveulet-alist
depois que a pergunta foi feita, mas está no espírito da pergunta e vale a pena mencionar a IMO!Respostas:
Aqui está uma opção que usa a sintaxe exata que você solicitou, mas de uma maneira generalizada, e é bastante simples de entender. A única diferença é que o
ALIST
parâmetro precisa vir primeiro (você pode adaptá-lo para vir em último, se isso for importante para você).Então você pode chamá-lo com:
fonte
Aqui está uma solução mais genérica:
Pode pegar qualquer "caminho" de chaves. Isso retornará
(bar . "llama")
considerando que isso retornará
(baz . "monkey")
:fonte
Aqui está uma função simples que trabalha com um alist aninhado dentro de outro alist:
fonte