Если вы используете библиотеку dash.el
, это все, что вам нужно:
(-distinct (-non-nil '(1 1 nil 2 2 nil 3)) ; => (1 2 3)
dash.el
написано Магнаром Свином, и это отличная библиотека для манипулирования списками со множеством функций для самых разных задач. Я рекомендую установить его, если вы пишете много кода Elisp. Функция -distinct
удаляет повторяющиеся элементы в списке, -non-nil
удаляет nil
элементы. Хотя приведенного выше кода достаточно, ниже я опишу альтернативный подход, поэтому не стесняйтесь игнорировать остальную часть поста.
-non-nil
был добавлен в версии 2.9, поэтому, если по какой-то причине вам придется использовать более ранние версии, другой способ добиться того же - использовать -keep
со встроенным identity
функция, которая просто возвращает то, что ей дано: (identity 1) ; => 1
. Идея состоит в том, что -keep
сохраняет только элементы, для которых предикат возвращает true («не ноль» на жаргоне Lisp). identity
очевидно возвращает ненулевое значение только для любых значений, отличных от нуля:
(-distinct (-keep 'identity '(1 1 nil 2 2 nil 3)) ; => (1 2 3)