kb84tkhrのブログ

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

Reasoned Schemer (28) わり算 続き

splitoは数をふたつの部分に分けてくれるわけですが

splitoは他にどんなことをしますか?
splitoは関係ですから、下位ビットのlと上位ビットのhを結合してnを作ることができます。rの長さを使ってパディングビットを詰めます。

こういうの聞くと関係に名前をつけるのが悩ましくなるな
結合でもあり分割でもある
関係なんだから動詞にしちゃいけないのかな

なぜsplitoの定義はこんなに複雑なのでしょうか?

そうそれ

splito(0)で数を表さないようにしないといけないからです。

そうだねー
表現がよくないってことかなあ?
でももっとキレイなやりかたというのも思いつかない

splitoはどうやって(0)ができないようにしているのですか。
nを下位ビットと上位ビットに分けたあと、右側の0を取り除いています。

ん、そんなことしてたっけ?

むー
字面だけ眺めててもわからなくなってきたなあ
Little Schemerのときみたいに書き下していけるといいんだけど
あんまりうまくかける気がしないんだよなあ
でもやってみよう

ここからスタート
(splito '(0 0 1 0 1) '(0 1) l h) --- (1)
これは4行目と6行目にマッチする
まずは4行目の方から
(splito '(0 1 0 1) '(1) '() h) --- (2)
これも4行目と6行目にマッチする
また4行目の方から
(splito '(1 0 1) '() '() h)
これは3行目にマッチして・・・と思ったけどl()に確定しちゃってるからマッチしない
ということはこのルートは失敗ってことになるわけか

ひとつもどって(2)
6行目にならマッチするかなと思ったけど l がマッチしない

もうひとつ戻って(1)
これは6行目にもマッチする
(splito '(0 1 0 1) '(1) ^l h), lは `(0 . ,^l)
4行目にはマッチしなくて6行目にマッチ
(splito '(1 0 1) '() ^l h), lは `(0 0 . ,^l)
ちょっと書きづらいなあ
でももう少し
これは無事3行目にマッチして
h(0 1)^l(1)、つまりl(0 0 1)ということ
お、できたか

読み方が甘かった
hlを求める、っていう意識になっちゃってた
2行目で言えば単に

n の最下位ビットが 0 で r が()なら
h は n の cdr で l は()

と思ってたけど、lが変数のときか()のときにしかマッチしないんだな
l()なら単にマッチするだけ、lが変数なら()になる、と
文章では書けなくなってきたぞ
他の引数も同じだし

でもこれで理解できるようになったかも?
次はlの右側の0がなくなる例でやってみよう