削除された内容 追加された内容
編集の要約なし
→‎lambda: 手続きを返す手続きの例を変更。説明のための例としては+のカリー化関数のような単純なものが良いかもしれない。
237 行
 
===lambda===
lambdaは手続きを新たに定義し、その手続きを表す値を返す構文です。Schemeは手続きの定義すら手続きの呼び出しあっても、数値や文字列と同じよに値として処理することがきます。lambda構文の第一引数には作成する手続きの引数名となる変数のリストを渡します。第2引数以降は手続き本体となる任意の式を取り渡します。ここで作成された手続きは一種の値なので、defineで束縛することができます。サンプルプログラムを示します。
 
> (define average (lambda (x y) (/ (+ x y) 2)))
average
> (average 10 20)
15
 
新たに定義した手続きは二つの引数をとり、その平均を返します。その手続きは変数averageに束縛しています。インタプリタは「(average 10 20)」を手続き呼び出しだと判断し呼び出しました。前述では手続き名には変数を記述すると解説しましたが、実際には手続きの値をとる式を書きます。averageには手続きが束縛されているため、リストの先頭に書くことができます。従って次のようなこともできます。
 
> ((lambda (x y) (/ (+ x y) 2)) 10 20)
15
 
平均を計算する無名の手続きを定義し、返り値をリストの先頭に使いその手続きを呼び出しています。
手続きは返り値にも使えるため、手続きを返す手続きも作成できます。下の例では、手続きを返す手続きを作成し、それを変数createAverageFunctionに束縛しています。そして変数createAverageFunctionを評価し、変数createAverageFunctionに束縛されていた先ほどの手続きを取得し、その手続きに引数10と20を与えています。
 
手続きは引数や返り値にも使えるため、手続きを返す手続きも作成できます。下の例では、最初に平均を計算する手続きを返す手続きを作成し、それを変数createAverageFunctioncreate-average-functionに束縛しています。そして変数createAverageFunctionを評価し2つめ、3つめで変数createAverageFunctioncreate-average-functionに束縛されていた先ほど平均を計算する手続きをつくる手続きに、まず加算と乗算定義を与え、平均を計算する手続きをます。そ、その手続きに引数10と20を与えて、具体的な平均値を計算しています。
>(define createAverageFunction (lambda () (lambda (x y) (/ (+ x y) 2))))
<source lang="scheme">
((createAverageFunction) 10 20)
> (define create-average-function
(lambda (add multiply)
(lambda (x y) (multiply (add x y) (/ 1 2)))))
</source>
<code> create-average-function</code>
<source lang="scheme">
 
> ((create-average-function + *) 10 20) ; 相加平均
</source>
<code> 15</code>
<source lang="scheme">
 
> ((create-average-function * expt) 10 20) ; 相乗平均、exptは累乗を計算する組み込み関数。
</source>
<code> 14.1421356...</code>
 
===quote===