*式(expression)を入力すると解釈系は応答してその式を評価した(evaluating)結果を表示する
=====整数を与えると、応答を印字=====
> > 486
486
=====手続き(+や*など)と組み合わせて合成式とし、手続きの作用を表現=====
> > (+ 137 349)
486
> > (* 5 99)
495
====組合せ、演算子、被演算子、引数====
=====利点=====
*任意の引数をとる手続きを許す
> > (+ 21 35 12 7)
75
*組合せを入れ子にする(nested)ことを許す
> > (+ (* 3 5) (- 10 6))
19
*オブジェクトを値(value)とする変数(variable)を識別するのものが名前
*defineで名前付け
> > (define size 2) > > size
2
*値と記号を対応付け、後にそれを取り出せるようにするために記憶しておくことを環境(environment) より正確には、大域環境(global environment)という
*手続き定義(procedure definetions) により、合成演算に名前を対応付け、一体として指すことができる
(define (<<名前> <> <仮パラメタ>>) <<本体>>)
=====二乗を表すsquare という合成手続き(compund procedure)を作る=====
> > (define (square x) (* x x)) > > (square 2)
4
===条件式と述語===
====場合分け(case analysis)====
*cond 場合分けを記述する特殊形式
(cond (<<p1> <> <e1>>) (<<p2> <> <e2>>)
:
(<<pn> <> <en>>))
> > (define (abs2 x) (cond ((> > x 0) x)
((= x 0) 0)
((< < x 0) (- x)))) > > (abs2 -19)
19
> > (abs2 0)
0
*特殊記号 else を利用できる
> > (define (abs3 x) (cond ((< < x 0) (- x))
(else x)))
*場合分けが2つの場合、特殊形式の if を利用できる
> > (define (abs4 x) (if (< < x 0)
(- x)
x))
!論理合成演算
|-
|(and <<e1> > ... <<en>>)
|-
|(or <<e1> > ... <<en>>)
|-
|(not <<e>>)
|-
|}
*定義の入れ子。単純な名前保護の機構。
*手続きの定義の中で別の定義を行うことができる。
> > (define (sqrt x)
(define (square a)(* a a))
(define (average a b)(/ (+ a b) 2))
(define (good-enough? guess x)
(< < (abs (- (square guess) x )) 0.001))
(define (improve guess x)
(average guess (/ x guess)))
(sqrt-iter 1.0 x))
> > (sqrt 10)
3.162277665175675
<<blockquote>>利用者にとって、重要な処理は、sqrt であり、good-enough?、improve、sqrt-iter は重要ではないので、sqrtの中に隠す<</blockquote>>
====静的有効範囲(lexicacl scoping)====
*上記例で、x は、sqrt の定義に束縛されている。なので、その内側の関数は、x の有効範囲内にあるため明示的に渡さなくてもよいので、自由変数にできる。こうしたやり方を静的有効範囲(lexical scoping) という。
(define (average a b) (/ (+ a b) 2))
(define (good-enough? guess)
(< < (abs (- (square guess) x )) 0.001))
(define (improve guess)
(average guess (/ x guess)))
(sqrt-iter 1.0))
<<blockquote>>ブロック内に定義した関数の仮引数から、x を取り除き、本体の中で利用することができる<</blockquote>>
==手続きとその生成するプロセス==
*熟練者になるには、いろいろな手続きの生成するプロセスを視覚化することを学ばなければならない。
====再帰的(recursive process)プロセス====
=====階乗の計算=====
<<blockquote>>n! = n・(n-1)・(n-2) ・・・3・2・1<</blockquote>>
(define (factorial n)
(if (= n 1)
(* n (factorial (- n 1)))))
=====結果=====
> > (factorial 4)
24
=====プロセスの視覚化=====
(define (factorial n)
(define (fact-iter product counter max-count)
(if (> > counter max-count)
product
(fact-iter (* counter product)