Вышеприведенная функция работает только для списков, которые составлены из символов, уже лексикографически упорядоченных. Так, например, он работает правильно для '(A B C) '(A B D)
, но не для '(A B C) '(B A D)
.
Есть несколько способов исправить это. Самый простой способ - вызвать его, отсортировав (с помощью stable-sort) два аргумента, например:
(defun stable-union-general (lst1 lst2)
(stable-union (stable-sort lst1 #'string<) (stable-sort lst2 #'string<)))
(stable-union-general '(A B C) '(B A D))
(A B C D)
Другой, менее эффективный способ - изменить алгоритм с учетом неупорядоченных списков.
Наконец, обратите внимание, что третья ветвь внешнего условного выражения никогда не определяется: ((and (null lst1) (null lst2)) nil)
Это связано с тем, что в этом случае первая ветвь имеет значение true, а функция возвращает nil
.