gaucheで第一引数のリストから第2引数のリストの要素を取り除く

なんだ関数が準備されてた。
http://practical-scheme.net/gauche/man/gauche-refj_102.html#IDX2027

>>(lset-difference eq? '(1 2 3 4 5 6 7) '(2 4 6 7))
=>(1 3 5)
(print (lset-difference eq? '(1 2 3 4 5 6) '(1 3 4 5)))
(print (lset-difference eq? '(1 2 3 4 5 6) '(1)))
(print (lset-difference eq? '(1 2 3 4 5 6) '(7)))
(print (lset-difference eq? '(1 2 3 4 5 6) '()))
(print (lset-difference eq? '(1 2 3 4 5 6) '(1 2 3 4 5 6)))
;=>(2 6)
;=>(2 3 4 5 6)
;=>(1 2 3 4 5 6)
;=>(1 2 3 4 5 6)
;=>()

以下は発見するまでの格闘の歴史。

どうもrubyのEnumerable::rejectgaucheのremoveは同じ関数だと思うんだが慣れない。
http://practical-scheme.net/gauche/man/?l=jp&p=remove

しょうがないので関数作った。
yとxの間の))が思考の邪魔をするんだよな…何でなんだろう。

(define (reject x y) (remove (lambda (a) (find (cut eq? a <>) y)) x))
(print (reject '(1 2 3 4 5 6) '(1 3 4 5)))
(print (reject '(1 2 3 4 5 6) '(1)))
(print (reject '(1 2 3 4 5 6) '(7)))
(print (reject '(1 2 3 4 5 6) '()))
(print (reject '(1 2 3 4 5 6) '(1 2 3 4 5 6)))
;=>(2 6)
;=>(2 3 4 5 6)
;=>(1 2 3 4 5 6)
;=>(1 2 3 4 5 6)
;=>()

うーん。もう一度考え直してみよう。
rubyでのコードは

>> [1,2,3,4,5,6,7].reject{|i|[1,3,5].include?(i)}
=> [2, 4, 6, 7]>> def f(x,y); x.reject{|i|y.include?(i)}; end
=> nil
>> f([1,2,3,4,5,6,7],[2,4,6,7])
=> [1, 3, 5]

これだから schemeの (lambda (a) (find (cut eq? a <>) y) これがy.include?{i}にあたるのか…memberか