関数を値として用いる (1/2)


関数の値って?

とりあえずは、以下の例を見てみましょう。 + や関数 foo の値をみてみました。
> +
#<primitive:+>
> (define (foo x y) (* (+ x 1) y))
> foo
#<procedure:foo>
このように、関数それ自体を値がなにか返事してくれます。 とはいえ、単に primitive であるとか procedure であるとかしか答えてくれませんが。 (ちなみに primitive function とは処理系がもともと提供している基礎的な関数のこと)

実は、Scheme では関数それ自身を普通の値として用いることができます。 つまりこんな感じです。

> (let ((func0 +)
        (func1 foo))
    (list (func0 2 3)
          (func1 2 3)))
(5 9)
> (define tmp (list + foo))   ; 関数を要素に持つリスト
> (list ((car  tmp) 2 3)      ; (+ 2 3) であり、
        ((cadr tmp) 2 3))     ; (foo 2 3) である。
(5 9)
+, foo の値を func0, func1 に bind して後、 (func0 2 3), (func1 2 3) を実行しています。

この様に、Scheme では関数を値として用いています。 普通に値として扱うことができるものを first class value といいます。 Scheme においては関数も first class value であるわけです ( C の場合 )。


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