(apply-generic op . args)

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

計算機プログラムの構造と解釈(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)))
;