Вы можете использовать списки, хотя они могут оказаться неэффективными для представления больших наборов. Это делается с помощью ADJOIN или PUSHNEW , чтобы добавить новый элемент в список, и DELETE или REMOVE , чтобы сделать обратное.
(let ((set (list)))
(pushnew 11 set)
(pushnew 42 set)
(pushnew 11 set)
(print set) ; set={42,11}
(setq set (delete 42 set))
(print set)) ; set={11}
Единственное, на что следует обратить внимание, это то, что эти операторы по умолчанию используют EQL для проверки на наличие возможных дубликатов в наборе (так же, как Java использует метод equals). Это нормально для наборов, содержащих числа или символы, но для наборов других объектов более глубокий тест на равенство, такой как EQUAL , должен быть указан как параметр ключевого слова: TEST, например, для набора строк: -
(let ((set (list)))
(pushnew "foo" set :test #'equal)
(pushnew "bar" set :test #'equal)
(pushnew "foo" set :test #'equal) ; EQUAL decides that "foo"="foo"
(print set)) ; set={"bar","foo"}
Аналогами Lisp некоторых операций Java в Set являются: