Предположим, у меня есть ассоциативный список, подобный этому:
(setq x '((foo . ((bar . "llama")
(baz . "monkey")))))
И я хочу значение в bar
. Я могу сделать это:
(assoc-default 'bar (assoc-default 'foo x))
Но то, что я действительно хотел бы, это то, что принимает несколько ключей, как
(assoc-multi-key 'foo 'bar x)
Существует ли такая вещь, возможно, где-нибудь в пакете? Я уверен, что мог бы написать это, но я чувствую, что мое Google-фу просто терпит неудачу, и я не могу найти это.
elisp
association-lists
abingham
источник
источник
assoc-multi-key
. Предположительно он ищет совпадения с обоими первыми двумя аргументами, но это действительно все, что можно предположить, исходя из того, что вы сказали. И он явно не может принять более двух ключей, поскольку аргумент alist (предположительноx
) является последним, а не первым, что говорит о том, что он не слишком полезен в целом. Попробуйте на самом деле указать, что вы ищете.setq
формы в примере сбивает с толку, поэтому я отредактировал его, чтобы использовать общую точечную нотацию для ассоциативных списков.assoc-multi-key
остается не уточненным.assoc-multi-key
том, чтобы найти первый ключ в ассоциативном списке. Это должно привести к новому списку ассоциаций, в котором мы ищем следующий ключ. И так далее. По сути, это сокращение для извлечения значений из вложенных ассоциативных списков.let-alist
тоже? например(let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)
вернется"llama"
. Я думаю, вы написалиlet-alist
после того, как вопрос был задан, но это в духе вопроса и очень стоит упомянуть ИМО!Ответы:
Вот вариант, который принимает тот синтаксис, который вы запросили, но в обобщенном виде, и довольно прост для понимания. Разница лишь в том, что
ALIST
параметр должен стоять первым (вы можете адаптировать его, чтобы он был последним, если это важно для вас).Тогда вы можете позвонить с помощью:
источник
Вот более общее решение:
Это может занять любой «путь» ключей. Это вернется
(bar . "llama")
тогда как это вернет
(baz . "monkey")
:источник
Вот простая функция, которая работает с алистом, вложенным в другой алист:
источник