高階関数の例(1/3)


filter 関数を定義する

高階関数が便利でしょう?という例を一つ。 (filter-list filter list) を作ってみましょう。 これは、list0 の要素に対して filter という関数を適用し、 true を返したもののみの list を返そうと言うものです。
(define (filter-list filter expr)
  (if (null? expr)
      '()
      (let ((first (car expr))
	    (filtered-rest (filter-list filter (cdr expr))))
	(if (filter first)
	    (cons first filtered-rest)
	    filtered-rest))))
-----
> (filter-list list? '((1 2) 3 p () ((6) 7 8)))
((1 2) () ((6) 7 8))
> (define (length-2-list? x)
    (and (list? x)
         (= (lenght x) 2)))
> (filter-list length-2-list?  '((1 2) 3 p () ((6) 7 8)))
((1 2))
高階関数を用いることで、このような汎用的につかえる関数を提供する事が出来ます。

99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp