Załóżmy, że mam taką listę assoc:
(setq x '((foo . ((bar . "llama")
(baz . "monkey")))))
I chcę wartość na bar
. Mogę to zrobić:
(assoc-default 'bar (assoc-default 'foo x))
Ale tak naprawdę chciałbym coś, co akceptuje wiele kluczy
(assoc-multi-key 'foo 'bar x)
Czy coś takiego istnieje, może gdzieś w paczce? Jestem pewien, że mógłbym to napisać, ale wydaje mi się, że mój Google-fu po prostu zawodzi i nie mogę go znaleźć.
elisp
association-lists
abingham
źródło
źródło
assoc-multi-key
. Przypuszczalnie szuka dopasowania do obu pierwszych dwóch argumentów, ale tak naprawdę można przypuszczać na podstawie tego, co powiedziałeś. I najwyraźniej nie może zaakceptować więcej niż dwóch kluczy, ponieważ argument alist (przypuszczalniex
) jest ostatnim, a nie pierwszym - co sugeruje, że ogólnie nie jest zbyt użyteczny. Spróbuj właściwie określić, czego szukasz.setq
formularza w tym przykładzie mylące, więc edytowałem go, aby użyć wspólnej notacji kropkowej dla list assoc.assoc-multi-key
pozostaje nieokreślone.assoc-multi-key
sprawdzenie pierwszego klucza na liście assoc. To powinno rozwiązać nową listę assoc, w której sprawdzamy następny klucz. I tak dalej. Zasadniczo skrót do wykopywania wartości z zagnieżdżonych list assoc.let-alist
też wspomnieć ? np .(let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)
wróci"llama"
. Wydaje mi się, że napisałeślet-alist
po zadaniu pytania, ale jest ono zgodne z duchem pytania i warto wspomnieć o IMO!Odpowiedzi:
Oto opcja, która przyjmuje dokładnie tę składnię, o którą prosiłeś, ale w uogólniony sposób i jest dość prosta do zrozumienia. Jedyną różnicą jest to, że
ALIST
parametr musi być na pierwszym miejscu (możesz go dostosować, aby był ostatni, jeśli jest to dla Ciebie ważne).Następnie możesz to nazwać za pomocą:
źródło
Oto bardziej ogólne rozwiązanie:
Może przyjmować dowolną „ścieżkę” kluczy. To wróci
(bar . "llama")
mając na uwadze, że to zwróci
(baz . "monkey")
:źródło
Oto prosta funkcja, która działa z listą zagnieżdżoną w innej listce:
źródło