Reasoned Schemer (90) half-adder, full-adder, poso, >1oあたりまで
7. A Bit Too Much
ビット演算から加算器作ったりする話
というか数を作る話と言った方がいいのかな
結局のところ、この処理系は変数とシンボルとそれらのリストがあって
==
でunifyできるってだけで数は存在してない
0
や1
は出てくるけどやっぱり数としての性質は持ってない
別に'a
と'b
で作ったって同じ(だと思う)
ちゃんと計算したり比較したりできる数を作ろうって話
Little Schemerでは()
で数を作ったけどアレの類
ってことが見えてきたのが2周目効果
見ていく
処理系の動きを追いかけるのはやめる
数の表現やfull-adder
あたりまでは特に言うことなし
build-num
、今振り返ってみるに定義しただけで結局使ってないっぽい
non-overlapping propertyの説明のために出てきたようにも見えるけど
それschemeの関数を例にする意味はあるのかな
(define (build-num n)
(cond ((odd? n) (cons 1 (build-num (quotient n 2))))
((and (not (zero? n)) (even? n))
(cons 0 (build-num (quotient n 2))))
((zero? n) '())))
単にいろんな数を試してみるときに便利なツールです、ってくらいかな
戻すほうはなくていいんですか
こうかな
(define (show-num x)
(cond ((null? x) 0)
(else (+ (car x)
(* 2 (show-num (cdr x)))))))
それとも数の表現を形式的に定義した?
しばらく2進数の練習が延々と
poso
とか>1o
とかの導入以上の意味があるのかはわからない
たかだか0より大きい、1より大きいってだけでこれは大変ですね、って思ったけど
考えてみたらschemeで書いたらもっと面倒なのか
同じロジックを書こうとしたらこう?
数が使えないとなるとほかに書き方も思いつかないか
(define (>1 n)
(and (pair? n)
(not (null? n))
(not (null? (cdr n)))))