(apply-generic op . args)

教育者, 将軍, 栄養士, 心理学者, 親はプログラムする. 軍隊, 学生, 一部の社会はプログラムされる. - 計算機プログラムの構造と解釈 序文

計算機プログラムの構造と解釈(SICP) 勉強メモ3

今日はなんか朝4時に目が覚めてしまったので、SICPのお勉強。
問題1.1~1.5までやりました。

;問題1.1
;式の列がある。それぞれの式で解釈系が印字する結果は何か。列は示した順に評価する物とする。
;$gosh で確認。oは正解。xは不正解。
;10 =>10 o
;
;(+ 5 3 4) =>12 o
;
;(- 9 1) =>8 o
;
;(/ 6 2) =>3 o
;
;(+ (* 2 4) (- 4 6)) =>6 o
;
;(define a 3) =>a o
;
;(define b (+ a 1)) =>b o
;
;(+ a b (* a b)) => 19 o
;
;(= a b) => #f o
;
;(if (and (> b a) (< b (* a b)))
;    b
;    a) =>4 o
;
;(cond ((= a 4) 6)
;      ((= b 4) (+ 6 7 a))
;      (else 25)) =>16 o
;
;(+ 2 (if (> b a) b a)) =>6 o
;
;(* (cond ((> a b) a)
;         ((< a b) b)
;         (else -1))
;   (+ a 1)) =>16 o
;
;;問題1.2
;(display
;  (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7)))
;)
;
;問題1.3
(define (q1-3 a b c)
  (+ (if (or (> a b) (> a c)) (* a a) 0)
     (if (or (> b a) (> b c)) (* b b) 0)
     (if (or (> c a) (> c b)) (* c c) 0)))

;問題1.4
;我々の評価モデルは、演算子が合成式である組合せでも使えることを観察せよ。
;それに従って、次の手続きの振る舞いを述べよ。
(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))
;a-plus-abs-bの引数bが0よりも大きい場合、特殊形式ifは+を返す。
;bが0よりも小さい場合、特殊形式ifは-を返す。
;つまり引数により
;(+ a b)
;なのか
;(- a b)
;なのかが決定される。
;
;問題1.5
;作用的順序の場合、(test 0 (p))で(define (p) (p))を評価し、無限ループとなる。
;正規順序の場合、基本演算子だけを持つ式が出てくるまで評価をしないので、test関数が評価される。
;そして、(if (= x 0))で#tなので0が返ってくる。
;つまり、無限ループに陥れば作用的順序。
;0が返ってくれば正規順序である。