例えば、関数が呼び出されるたびにその旨表示されるようにしたいとします。 そのために、1 引数の関数 func に対して、表示機能付きの関数を返す関数 func1-with-debug-print を作るとします。
(define (func1-with-debug-print func func-name)
(lambda (x) (begin
(display func-name)
(display " called with arg: ")
(display x)
(newline)
(func x))))
-----
> (let ((db-length (func1-with-debug-print length "length")))
(map db-length '(() (1) (1 2) (1 2 (3)))))
length called with arg: ()
length called with arg: (1)
length called with arg: (1 2)
length called with arg: (1 2 (3))
(0 1 2 3)
func1-with-debug-print が返すのは「引数 x をとるラムダ式」であり、
そのラムダ式はまず func-name や引数 x の値などを表示した後、
(func x) を実行しその返り値とします。
つまり、関数がラムダ式を値として返す事ができるため、 「関数を引数とし、それに応じた関数をあらたに生成し、返り値とする」 ような高階関数が記述出来るわけです。
99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp