はじめに

SICP を今年から読んでいます. 第一章を読むのに 2 ヶ月かかった!

こりゃ, 全部読みきるのに 1 年くらいはかかりそうだ… or2.

気長に楽しみながら頑張る. 切りがいいので, ここまでの要点をまとめてみる.

手続きとは

大事な, そしてややこしい用語がでてくるので, 整理する.

式 (Expression)

計算機の解釈系に渡される前の表現. 解釈系に評価されると, 式はプロセスになる.

以下, wikipedia からの引用も.

言語によって定められた優先順位や結びつきの規定に則って評価 される値, 変数, 演算子, 関数の組み合わせ.

プロセス (Process)

プロセスは計算機のなかに潜む抽象的な存在. プロセスはもう一つの抽象的な存在, データを操作する. プロセスの進行は, 規則のパターン, プログラムにしたがう.

プログラム (Program)

プロセスの進行を指示する, 規則のパターン.

プログラムは二つの要素をもつ.

  • 手続き: データの処理方法 (能動的) ex.) +, -
  • データ: 処理したいもの (受動的) ex.) 1,2,3

手続きによる抽象の構築

この章のおもしろいところは, はじめは基本的な手続きからはじまり, ひとつずつ抽象度をあげていくところにある.

章でいうと, 1.1 と 1.3. 1.2 は再帰手続きについてかかれている.

                     procedures       data

primitive element +, *, <, = 23, 1.738 means of combination () combination
if
cond
means of abstraction defun

言語は以下の仕掛けを有している.

Level0: 基本式 (プリミティブな手続きの構築)

もっとも基本的な手続き.

  • which represent the simplest entities the language is concerned with,
  • 言語が関わるもっとも単純なものを表す.

primitive expressions 基本式:

  • which represent the simplest entities the language is concerned with,
  • 言語が関わるもっとも単純なものを表す.
1, +, -

Level1: 組合せ法 (組み合わせ手続きによる抽象の構築)

複数の手続きを組み合わせて一つにした手続き.

  • by which compound elements are built from simpler ones.
  • より単純なものから合成物をつくる.

Emacs Lisp では 組合せ (combination) は () で表現する.

(* 1 1)

Level2: 抽象化法 (名前つき値による抽象の構築)

オブジェクトを値 (value) とする変数 (variable) を識別するものが名前. 名前をつけることで, 値を識別する.

Emacs Lisp では 名前つけは defun で表現する.

(defun size () 2)
(size)

Level3: 手続き定義 (名前つき手続きによる抽象の構築)

名前付けは, 値だけでなくて手続きにもできる.

  • by which compound elements can be named and manipulated as units.
  • 合成物に名をつけ, 単一のもとして扱う.

名前のつけられた手続き. これをいわゆる関数と呼ぶ.

(defun square (x) (* x x))

手続き定義は, 細部をかくすことができる. いわゆる 手続き抽象 という.

Level4: 高階手続きによる抽象の構築

手続きをあつかう手続きを高階手続きという

  • 手続きを引数にとる
  • 手続きを戻り値として返す
(square (square (square 2)))

Level5: lambda (名前なし手続き による抽象の構築)

高階手続きの引数にいちいち, defun で定義された手続きをわかすのは煩わしい.

名前なしの手続きを扱いたい. プロセスを生み出す特殊形式を lambda という.

Emacs Lisp では lambda で表現する.

名前つき手続きは, 以下の糖衣構文となっている. Lisp インタプリタは実際には以下のように解釈している.

(defun square
    (lambda (x) (* x x))

さいごに

さいごに, 感動したセンテンスをぬきだして, 第一章を締めくくる.

われわれはプログラマとして, プログラムの根底にある抽象をみつけ, より強力な抽象化ができるように努めてなければならない.

高階手続きの重要さは, それにより抽象をプログラム言語の要素して 確かに表せ, 他の計算要素として扱えるようになる点にある.