計算機プログラムの構造と解釈(SICP) 勉強メモ2
今日は2P進んだ。
condはカッコッカが多くなるから”大失敗”らしい。
;;1.1.6 条件式と述語 ;Lispには場合を分け(case analysis)を記述するための特殊形式がある。それをcond(conditional(条件付き)意味する)といい、次のように使う。 ; ;(define (abs x) ; (cond ((> x 0) x) ; ((= x 0) 0) ; ((< x 0) (- x)))) ; ;条件式の一般形は ; ;(cond (<p1> <e1>) ; (<p2> <e2>) ; . ; . ; . ; (<pn> <en>)) ; ;のように記号condに続けて、節(clauses)というカッコに入った式の対(<p> <e>)を並べた物である。 ;式の最初の式は述語(predicate)-値を真か偽か解釈する式-である。 ; ; 条件式は次のように評価する。 ;まず述語<p1>を評価する。その値が偽なら<p2>を評価する。<p2>の値もまた偽なら<p3>を評価する。 ;その手順を値が真である述語が見つかるまで続ける。 ;見つけたら、解釈系は、その節の対応する帰結式(consquent expression)<e>の値をこの条件式の値として返す(返す!返すんだよ!)。 ; ; 述語(predicate)という用語は、真と偽に評価される式と同様、真か偽を返す手続きにも使う。 ;絶対値の手続きを書くもう一つの方法は ; ;(define (abs x) ; (cond ((< x 0) (- x)) ; (else x))) ; ;で、自然言語で「xが0より小さければ-xを返す;それ以外はxを返す」と読むことが出来る。 ;絶対値を書く更に別の方法がある。 ; ;(define (abs x) ; (if (< x 0) ; (- x) ; x)) ; ;これは特殊形式ifを使う。ifは場合分けが丁度二つであるような制限付きの条件式である。 ; ;(if <述語:predicate> <帰結式:consquent> <代替え部:alternative>) ; ;if式(式だ!)を評価するには、解釈系は式の述語<predicate>部分を評価する。<predicate>の評価の結果が真なら、解釈系は帰結部<consequent>を評価しその値を返す。 ; ; <,>,=のような基本的述語の他に、合成述語を作るための論理合成演算がある。最も欲使われるのが三つある。 ; ;・(and <e1> ... <en>) ;解釈系は式<e>を左から右へ一つずつ評価する。ある<e>の評価が偽なら、and式の値は偽で、残りの<e>は評価しない。 ;(っていうか、普通にand演算。日本語難しいなー) ; ;・(or <e1> ... <3n>) ;解釈系は式<e>を左から右へ一つずつ評価する。ある<e>の結果が真なら、その値をor式の値として返し、残りの<e>は評価しない。 ;(っていうか(ry)) ; ;・(not <e>) ;not式の値は、式<e>の評価の結果が偽なら真、そうでなければ偽である。 ;(って(ry)) ; ;これらの使用例として、数xが範囲5<x<10にあるという条件は ; ;(and (> x 5) (< x 10)) ; ;と書ける。別の例で、ある数がもう一つの数より大きいか、等しいかを調べる手続きが定義できる。 ; ;(define (>= x y) ; (or (> x y) (= x y ))) ; ;あるいは ; ;(define (>= x y) ; (not (< x y))) ;