by shigemk2

当面は技術的なことしか書かない

SICP(計算機プログラムの構造と解釈 第二版)読書会 #yomukai

yomukai.connpass.com

手続きによる抽象の構築

http://sicp.iijlab.net/fulltext/x100.html

プログラム > プロセス > データ

計算プロセスは計算機の中に住む抽象的な存在である. プロセスは進行しながらもう一つの抽象的な存在, データ(data) を操作する. プロセスの進行は規則のパターン, プログラム(program)の指示に従う. われわれはプロセスに指示しようとしてプログラムを作る. いわばわれわれの呪文で計算機の霊に魔法をかけるのだ.

バグ

巧みに設計された計算システムは, 巧みに設計した自動車や原子炉と同様, モジュラに作られていて, 部品ごとに作り, 交換し, 個々に虫とりが可能である.

Lispの歴史

省略。

Lispによるプログラム

Lispが, 主要なプログラムの構成やデータの構造を学び, それを言語の基礎となる言語学的機能に関係づけるのに優れた媒体とする独特の特徴を持っているからである. 特徴のもっとも著しいのはプロセスの 手続き(procedures)というLispによる記述自体がLispデータとして表現, 処理出来ることである. 「受動的」なデータと「能動的」なプロセスを区別する伝統をぼやかす点に依存した強力なプログラム設計技法が使えるからだ. 何にもましてLispでプログラムを書くのは大いに楽しいことでもある.

プログラムの要素

http://sicp.iijlab.net/fulltext/x110.html

強力なプログラム言語は, 計算機に仕事のやり方を指示する手段以上のものである

強力な言語には三つの仕掛け

  • 基本式 言語が関る最も単純なものを表す.
  • 組合せ法 より単純なものから合成物を作る.
  • 抽象化法 合成物に名をつけ, 単一のものとして扱う.

データは処理したい「もの」であり, 手続きはデータの処理法の記述である. 強力なプログラム言語は基本的データと基本的手続きが記述出来, 手続きとデータを組み合せたり抽象化したりする手段を持たなければならない.

アラン・パリス - Wikipedia

本書では単純なデータ(数値)のみを扱う*1

1.1.1 式

式(expression)を入力すると解釈系は応答してその式を評価した(evaluating)結果を表示する. 数を表現する式は 基本的な手続き(+や*など)を表現する式と組み合せて合成式とし, 数に対するそれらの手続きの作用を表現することが出来る

gosh> 486
486
gosh> (+ 137 349)
486
gosh> (- 1000 334)
666
gosh> (* 5 99)
495
gosh> (/ 10 5)
2
gosh> (+ 2.7 10)
12.7

式の並びを かっこで囲んで 手続きの作用を表現する上のような式を組合せ (combinations)という. 並びの左端の要素を 演算子(operator), 他の要素を 被演算子(operands)という. 組合せの 値は演算子が指定する手続きを, 被演算子の値である 引数(arguments)に作用させて得る.

  • 演算子
  • オペランド
  • 引数

演算子を被演算子の左に置く書き方を 前置記法(prefix notation)という. 習慣的な数学の書き方とかなり違うので, 初めのうちは混乱するかも知れない. しかし前置記法には多くの利点がある. その一つは次の例のように 任意個の引数をとる手続きを許すことである.

  • ネストも可能

REPL

  • 読み込み(read)
  • 評価(eval)
  • 印字ループ(print loop)

端末から式を読み込み, その式を評価し, 結果を印字する*2

1.1.2 名前と環境

値と記号を対応づけ, 後にそれが取り出せるためには, 解釈系は名前とオブジェクトの対を見失わないための, 何か記憶を保持していることに他ならないことは明らかである. この記憶を 環境(environment)(より正確には, 後になって計算は多くの異る環境に関るということが分る故に 大域環境(global environment))という

計算機プログラムの構造と解釈[第2版]

計算機プログラムの構造と解釈[第2版]

  • 作者: ハロルドエイブルソン,ジュリーサスマン,ジェラルド・ジェイサスマン,Harold Abelson,Julie Sussman,Gerald Jay Sussman,和田英一
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/05/17
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る

*1:ここでいう数値については、整数の範囲、小数点の桁数などについてはあまり考えないこととする

*2:Lispはすべての式には値があるという約束に従う. この約束はLispの非効率言語という昔の評判とともに Alan Perlisの「Lispプログラマはすべての値 (value)は知っているが, 価値(cost)は知らない」 (Oscar Wildeのパロディ)の警句につながっている.