• Set difference

    From B. Pym@21:1/5 to All on Fri Aug 15 01:37:18 2025
    XPost: 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)]))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)