今日から8章だ。
関数を引数にとる関数が出てきた(高階関数だ!)。rember-f は rember と同様に、リストからメンバーを削除するけど、削除するメンバーを探す(比較する)関数も引数として受け取る。たとえばリストが数のリストなら比較のために o= を、S式のリストなら equal? を引数として受け取るわけだ。
ちょっと難しいけど、うん、まあこのくらいなら書けそうだ。
(use mymodule) (define rember-f (lambda (test? a l) (cond ((null? l) (quote ())) ((test? (car l) a) (cdr l)) (else (cons (car l) (rember-f test? a (cdr l))))))) (print (rember-f o= 5 '(6 2 5 3))) (print (rember-f eq? 'jelly '(jelly beans are good))) (print (rember-f equal? '(pop corn) '(lemonade (pop corn) and (cake))))
実行結果:
^o^ > gosh -I. rember-f.scm (6 2 3) (beans are good) (lemonade and (cake))
うまくいった。