今日から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))
うまくいった。