SICP事始

SICPを本格的に読み進めていこうと思います。
自分用になるかもしれませんが、備忘録的に書き留めていきます。
まとめられるような段階になったら読みやすくしたいなとも考えています。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈

Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)

Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)

■ 単純な概念を統合して複雑な概念を構成するために強力な言語には3つの仕掛けがある。

・基本式	         言語の最も単純なものを表す。
	→Lisp:数と演算子は基本的データと手続きである。

・組合せ法	より単純なものから合成物を作る。
         →Lisp:組合せの入れ子は演算を組み合わせる手段である。

・抽象化法	合成物に名前を付け、単一のものとして扱う
	→Lisp:名前と値を対応づける定義と手続き定義が抽象の手段である。

■ 前置法の利点

・任意個の引数をとる手続きを許す(演算子は必ず最左。式は必ず()に囲まれており、曖昧さがない)
・入れ子にすることを許す(Lispには原則制限がない)

■ 述語

・真と偽に評価される式
・真と偽を返す手続き

■ ニュートン法(今日やっててすごく楽しかったコードです。)

;■ Newton Method

;;- sqrt ----------------------------
(define (sqrt x)
  (sqrt-iter 1.0 x))

;;- sqrt-iter -----------------------
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))

;;- guess number --------------------
(define (improve guess x)
  (average guess (/ x guess)))

;;- average -------------------------
(define (average x y)
  (/ (+ x y) 2))

;;- good-enough? --------------------
(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))

;;- square ---------------------------
(define (square x)
  (* x x))

;;- abs ------------------------------
(define (abs x)
  (if (< x 0) (- x) x))

このコードは「大きすぎる数」「小さすぎる数」(このプログラムにとってということでしょうが)はうまく動かないという欠点があります。
欠点を克服したプログラムを早いうちに組む予定。