プログラミング再入門

プログラミングをもう一度ちゃんと勉強する読書ノート

SICP 1.3.2 Constructing Procedures Using Lambda

ノート

lambdaを使った手続きの構築。
ほんの小さな、かつその場限りの関数にいちいち名前を付けなければならないのは面倒。関数を定義するときのdefineはlambdaを使った表記の省略形である。
Schemeではlamdaをそのままオペレータとしてリストの先頭で使う事が出来る。

Using let to create local variables

letで局所変数を作り初期化する過程は、lambdaで局所関数を作ってその仮引数に実引数を割り当てて呼び出すのと等価。
と言う事は、普通の手続き呼び出しと同様にletの各局所変数の初期化の式はletのブロックの外側のスコープにあり、各局所変数に値が割り当てられる前に全ての値は計算(評価)される事になる。

Exercise 1.34

fは引数に与えられた関数を定数2に適用する関数。
(f f)は(f 2)と評価されるが、引数の2は関数として扱われるので次に(2 2)と評価される。ここで2と言う関数を呼び出そうとするが、2と言う関数は存在しないのでエラーで止まる。

> (define (square x) (* x x))
> (f square)
4
> (f (lambda (z) (* z (+ z 1))))
6
> (f f)
. . procedure application: expected procedure, given: 2; arguments were: 2
>