Я не очень хорошо знаю Common Lisp, поэтому вот реализация Scheme кода, вставленного Беном:
(define (difference big small)
(fold delete big small))
(define (delete x lst)
(delete-by equal? x lst))
(define (delete-by equal? x lst)
(if (null? lst) '()
(receive (y ys) (car+cdr lst)
(if (equal? x y) ys
(cons y (delete-by equal? x ys))))))
, где fold
и car+cdr
взяты из SRFI 1 и receive
происходит от SRFI 8 .
Если мы позволим себе использовать форму SRFI 26 * cut
,тогда у нас есть решение, которое выглядит еще ближе к версии на Haskell (поскольку последняя использует каррирование как минимум в двух местах):
(define difference (cut fold delete <...>))
(define delete (cut delete-by equal? <...>))
; Unchanged from the above version
(define (delete-by equal? x lst)
(if (null? lst) '()
(receive (y ys) (car+cdr lst)
(if (equal? x y) ys
(cons y (delete-by equal? x ys))))))