Вопрос: каков идиоматический способ сопоставления функции в списке свойств?
Различные функции отображения ( mapcar
и семейство) отображают функцию на последовательность, такую как список. Как можно использовать эти функции при работе со списком свойств , т. Е. При попытке отобразить каждое из свойств, содержащихся в списке (который будет любым другим элементом, начиная с первого)? Мне кажется, что функция отображения должна была бы получить доступ к списку в парах элементов, а не как отдельные элементы.
Например, как взять список свойств и собрать все значения свойств? Если бы это был список ассоциаций, это было бы довольно просто:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Я уверен, что это можно сделать с помощью цикла, но это кажется немного трудоемким, и мне интересно, есть ли более идиоматический способ сделать это.
mapcar
пример alist) или вы хотите отобразить пары символов и значений свойств. Последнее, я думаю, является более общим (более полезным).Ответы:
Скорее всего, вы получите различные
loop
итерационные ответы. AFAIK, нет идиоматического способа сделать это. Я даже не думаю, что очень часто хочется накапливать только значения свойств (не связывая их со свойствами).Вот один простой способ сделать это:
Для более общего случая, когда вы хотите отобразить бинарную функцию через plist:
источник
Это, вероятно, будет зависеть от ситуации. В общем, если мне нужно связать несколько значений с несколькими именами, я бы использовал хеш-таблицу, но если бы мне пришлось использовать список свойств, я бы использовал
cl-loop
. Ниже приведены некоторые примеры:И если у вас есть структура данных, которую вы показываете в своем примере:
источник
Для меня ответ заключается в том, чтобы превратить список в alist, который является эквивалентной структурой данных, вдвое менее глубоким и более простым в управлении.
источник
С Emacs из текущей Git HEAD, которая станет Emacs 25, вы можете сделать следующее, то есть легко превратить plist в alist с помощью новой
seq-partition
функции, а затем обработать записи в alist с использованием стандартаmapcar
.Посмотрите на
seq-partition
документы, используяC-h f seq-partition RET
.источник
Одна идея состоит в том, чтобы использовать
-map-indexed
изdash
и применять преобразование только к нечетным значениям списка:Другая идея состоит в том, чтобы просто преобразовать PLIST в хэш-таблицу, используя
ht<-plist
изht
:Обратите внимание, что хэш-таблица не сохраняет порядок элементов.
источник