Skip to content

Instantly share code, notes, and snippets.

@shigemk2
Last active December 26, 2015 09:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shigemk2/7133070 to your computer and use it in GitHub Desktop.
Save shigemk2/7133070 to your computer and use it in GitHub Desktop.
SICP第1章読書ノート

プログラムの要素

プロセス は進行しながら データ を操作する プロセスの進行は規則のパターン、 プログラム の指示に従う

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

を入力するとインタプリタは応答してその式を 評価 した結果を表示する。

(+ 137 349)
486
(- 1000 334)
666
(+ 2.7 10)
12.7

式の並びをかっこで囲んで手続きの作用を表現する式を 組み合わせ という 並びの左端の要素を 演算子 、他の要素を 被演算子 (引数)という。

Lispの書き方は 前置記法 という 入れ子もおk

(+ (* 3
        (+ (* 2 4)
	   (+ 3 5)))
	(+ (- 10 7)
	6))
57

インタプリタは読み込み→評価→印字のループを回っている。

名前と環境

名前を使って計算オブジェクトを指す手段を用意してる オブジェクトを値とする 変数 を識別するものが名前である なお、Scheme方言ではdefineを使って名前をつけ、記憶する。 この記憶を 環境 (大域環境)という

一般に計算オブジェクトがとても複雑な構造を持ち、それを記憶しなければならないとか、 使うたびに細部まで繰り返さなければならないとしたら極めて不便である。実際、複雑な プログラムの対応づけが対話によって次々と出来上がっていくから、この一歩一歩の プログラムの構成が特に便利になっている。この機能は、プログラムの漸次的開発とテストを 奨励し、Lispプログラムが通常多くの比較的単純な手続きから構成されているという事実の 根拠になっている

組み合わせの評価

組み合わせの評価

  1. 組み合わせの部分式を評価
  2. 最左部分式の値である手続き(演算子)を、残りの部分式である引数(被演算子)に作用させる
  3. 数字列の値はその表す数値となる
  4. 基本演算子の値は、対応する演算を実行する機械命令の列とする
  5. それ以外の名前の値は、その環境で名前と対応づけられたオブジェクトとする

これらの規則には例外があり、定義はこれらの規則から外れる。

(define x 3)

などがそうで、defineはxや3に何かしらの作用を及ぼすわけではない。 これらの例外を特殊形式という。

評価の規則は本質的に再帰的である。つまり、手順の一部に規則自身を呼び起こす必要がある

(* (+ 2 (* 4 6))
	(+ 3 5 7))
390

木構造の溜め込み(tree accumulation)

様々な規則を再帰的に呼び出し、式の評価規則は単純な一般規則と、少数の特殊形式に特化した規則でできている。

合成手続き

数と算術演算子基本的データと手続きである 組み合わせの入れ子は演算を組み合わせる手段である 名前と値を対応づける定義は抽象のそこそこの手段である

手続き定義(procedure definitions) とは、強力な抽象化技法であり、 合成手続きは基本的手続きとまったく同様に使うことが出来る。

演算子として使うことも出来るし、定義そのものを評価することも出来る

(define (square x) (* x x))
square
(square 21)
441
(square (+ 2 5))
49
(square (square 3))
81
(define (sum-of-squares x y)
	(+ (square x) (square y)))
sum-of-squares
(sum-of-squares 3 4)
25
(define (f a)
	(sum-of-squares (* a 1) (* a 2)))
f
(f 5)
125
square
#<closure square>

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

たとえば、

(square 5)

というS式を見るとき、手続きを以下のように変更することが出来る

(square 5)
(* 5 5)
25

上のように書き直すプロセスを置き換えモデルという。

正規順序の評価と作用的順序の評価の違いについては、 以下を参考にしてみる http://d.hatena.ne.jp/knowledgetree/20100912/1284305197

条件式と述語

場合分けではcondを使う

(define (abs x)
	(cond ((> x 0) x)
	      ((= x 0) 0)
              ((< x 0) (- x))))
abs

condにつづけて、 節(clauses) というかっこに入った式の対を並べる あれです、if ... end をまとめて節といい、条件式の部分を 述語 という

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment