はじめに
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))
さいごに
さいごに, 感動したセンテンスをぬきだして, 第一章を締めくくる.
われわれはプログラマとして, プログラムの根底にある抽象をみつけ, より強力な抽象化ができるように努めてなければならない.
高階手続きの重要さは, それにより抽象をプログラム言語の要素して 確かに表せ, 他の計算要素として扱えるようになる点にある.