blog/content/post/2008-11-30-reading-sicp-2.md

5.9 KiB
Raw Blame History

title author date url wordtwit_post_info categories
Reading SICP 2 kazu634 2008-11-30 /2008/11/30/reading-sicp-2/
O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4409;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}
Lisp

Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)を読む、その2です。今回は

  • compound procedure例えば (define (square a) (* a a))しておいてから、(define (sum-of-square a b) (+ (square a) (square b)))と書いた時の「(define (sum-of-square a b) (+ (square a) (square b)))」のこと)
    • substitution model (インタープリタ内部でどのようにcompound proedureを評価するのか。暫定的な説明として、「手続きを置き換え(substitute)てprimitiveな手続きのみの組み合わせに変換する」というモデルが導入される。でも、これは後で破綻するよって書いてあった)
      • Applicative orderインタープリタが行っている方法。引数を先に評価してから、operandを適用する
      • normal order(まずはoperandをどんどんprimitiveな手続きに変換する)

というようなことが書いてありました(私の理解が間違えていなければ…)。

Excercise (pp 20-21)

Excercise 1.2

Translate the following expression into prefix form

¥frac{5 + 4 + (2 - (3 - (6 + ¥frac{4}{5})))}{3(6 - 2)(2 - 7)}

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7)))
Excercise 1.3

Define a procedure that takes 3 numbers as arguments and returns the sum of the squares of the two larger numbers.

(define (sum-of-square a b c)
(define (square n)
(* n n))
(cond [(and (< a b) (< a c)) (+ (square b) (square c))]   ; when a is the smallest
[(and (< b a) (< b c)) (+ (square a) (square c))]   ; when b is the smallest
[(and (< c a) (< c b)) (+ (square a) (square b))])) ; when c is the smallest