> + #<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