• Set difference

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp,comp.lang.scheme on Fri Aug 15 01:37:18 2025
    From Newsgroup: comp.lang.scheme

    I have 2 sets - set1 ((a 1) (b 2) (c 3) (d 4)) and set2 (b c) -
    and want something like a set difference.

    With (remove-if (lambda (x) (member (car x) set2)) set1) I can
    get what I want ((A 1) (D 4)).

    I just wonder if it's possible to use set-difference with some
    key or test function to get the same result. It should compare
    (car member) in the first set with member in the second set.

    (let ((set1 '((a 1) (b 2) (c 3) (d 4)))
    (set2 '(b c)))
    (filter~ (k v) (not (member k set2)) set1))

    ===>
    ((a 1) (d 4))


    Given:

    (define-syntax fn*
    (syntax-rules ()
    [(_ (a b c ... . d) . z)
    (lambda (xs)
    (let-values (((a b c ... . d) (apply values xs))) . z))]
    [(_ (v ...) . z)
    (lambda (xs) (let-values (((v ...) (apply values xs))) . z))]
    [(_ (a . b) . z)
    (lambda (xs) (let ((a (car xs)) (b (cdr xs))) . z)) ]
    [(_ a . z) (lambda (a) . z) ] ))

    (define-syntax filter~
    (syntax-rules ()
    [(_ v expr lst) (filter (fn* v expr) lst)]))

    --- Synchronet 3.21a-Linux NewsLink 1.2