multirember-f
multiremver の定義は次のとおりだった。
(define multirember
(lambda (a lat)
(cond
((null? lat) (quote ()))
((eq? (car lat) a) (multirember a (cdr lat)))
(else (cons (car lat) (multirember a (cdr lat)))))))
今度は multirember-f を書いてください、ときた。簡単だ。test? を引数にとって、上の定義の中の eq? を test? に、multirember を (multirember test?) に置き換えたものを返してやればいい。
(define multirember-f
(lambda (test?)
(lambda (a lat)
(cond
((null? lat) (quote ()))
((test? (car lat) a) ((multirember-f test?) a (cdr lat)))
(else (cons (car lat) ((multirember-f test?) a (cdr lat))))))))
(print ((multirember-f eq?) 'tuna '(shrimp salad tuna salad and tuna)))
^o^ > gosh multirember-f.scm (shrimp salad salad and)
multiremberT
ここで eq?-c が再登場する。この関数はアトム a を引数にとって「アトム x を引数にとって a 比較する関数」を返す関数だった。x を tuna と比較する関数 eq?-tuna は次のように書ける。
(define eq?-tuna (eq?-c 'tuna))
さて、今度は、この eq?-tuna のような関数とラットを引数にとって multirember と同じように動作する multiremberT を書け、ときた。大丈夫、たぶん書けるだろう。
(define eq?-c
(lambda (a)
(lambda (x)
(eq? x a))))
(define eq?-tuna (eq?-c 'tuna))
(define multiremberT
(lambda (test? lat)
(cond
((null? lat) (quote ()))
((test? (car lat)) (multiremberT test? (cdr lat)))
(else (cons (car lat) (multiremberT test? (cdr lat)))))))
(print (multiremberT eq?-tuna '(shrimp salad tuna salad and tuna)))
実行結果:
^o^ > gosh multiremberT.scm (shrimp salad salad and)
よかった、OKのようだ。