selflearn @ ウィキ

SICP(1.1 プログラムの要素)

最終更新:

kato

- view
メンバー限定 登録/ログイン

『1.1 プログラムの要素』

まとめ

ここではSchemeの文法紹介がメイン。ただし、評価の順序として挙げられている、
  • 作用的順序の評価
  • 正規順序の評価
という2点の違いはよく覚えておくことが必要。前者の「引数をとにかく評価していって、逐次的に作用させていく」処理は、後者の「完全に展開してから評価する」とは結果が異なる場合がある。

各小節の内容

1.1.1 式

前置記法では
(* 25 4 12)
-> 1200
というように、任意数の引数を渡せることがポイント。Cの関数とはカッコの括り方が違うだけ、というように覚えると何だか急に分かりやすくなった。

1.1.2 名前と環境

名前はdefineで付けられる。
「(大域)環境」という単語が出ているけど、後で出てくるのだろうか?

1.1.3 組合せの評価

大事な言葉が出ている。
・・・すなわち、評価の規則は、本質的に再帰的(recursive)である;
つまり、手順の一部に規則自身を呼び起こす必要がある。
再帰を学ぶためにSchemeに触れようとしているけれど、実はもう再帰を使いこなしていたのである(ホントかよ)。
他にもいろいろと大事な事項が書かれているので、いくつか転載しておく。
- 数字列の値は、その表す数値とする
- 基本演算子の値は、対応する演算を実行する機会命令の列とする
- それ以外の名前の値は、その環境で名前と対応付けられたオブジェクトとする
上記を一般評価規則と呼んでいる。ただし、defineのような「特殊形式」と呼ばれるものもある。
「それ以外の特殊形式もいろいろとある」とあるけれど、なんだろう。

1.1.4 合成手続き

合成手続き(compound procedure)と呼ばれる関数の作り方。defineを用いたプロシージャの作り方を説明しているのみ。

1.1.5 手続き作用の置き換えモデル

作用的順序・正規順序の評価の違いについて。
作用的順序
まず演算子と被演算子を評価し、次に結果の引数に作用させる
正規順序
その値が必要になるまで、被演算子を評価しない(ギリギリまで展開してから評価開始)。

「引数を評価して、作用させる」というプロセスを説明している。Schemeは作用的順序の評価を用いているけれど、3章の「ストリーム処理」は正規順序の評価に取り込むとのこと。どう実現するのか、楽しみ。

1.1.6 条件式と述語

特殊形式「cond」。Cのswitch文に近いけれど、各節(分岐)それぞれに対して式を適用できる。if~else if~elseと考えるべきのよう。

1.1.7 例:Newton法による平方根

Newton法による平方根の近似値をSchemeを使って求める方法。特に問題なし。

1.1.8 ブラックボックス抽象としての手続き

構造化による手続き細部の隠蔽、パラメータ・定義名の局所化について。ここはCでも同じ考え方をしているので、問題なし。
ただし、
  • 定義の中に別の定義を書けること
  • 定義の中にある定義は、親(上位)の定義で用いているパラメータ・定義をそのまま利用できる
という点は覚えておくこと。後者は特に今後重要になりそう。

タグ:

SICP scheme
記事メニュー
目安箱バナー