計算機プログラムの構造と解釈(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が返ってくれば正規順序である。