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::rejectとgaucheの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か