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