kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (90) half-adder, full-adder, poso, >1oあたりまで

7. A Bit Too Much

ビット演算から加算器作ったりする話
というか数を作る話と言った方がいいのかな

結局のところ、この処理系は変数とシンボルとそれらのリストがあって
==でunifyできるってだけで数は存在してない
01は出てくるけどやっぱり数としての性質は持ってない
別に'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)))))