いまだに分からん

The Little Schemer 159ページ中ほどから

  • Mr.Leftcolumn(以下L

alignの引数にあるアトムの個数を数える関数を書けるかい?

  • Mr.Rightcolumn(以下R

もちろんさ

(define length*
  (lambda (pora)
    (cond
     ((atom? pora) 1)
     (else (+ (length* (first pora))
	      (length* (second pora)))))))
  • L

alignはpartial functionかな?

  • R

わかりません。
alignし続けるかもしれません。

  • L

align関数の引数の変化、align関数の再帰について何かある?

  • R

pairの最初の要素は単純に、2つ目の要素はより複雑になっていくね。

  • L

どんな風に単純になっていくのかな?

  • R

元のペアの最初の要素だけになっちゃうよ。

  • L

ってことは、length*は正しく引数の長さを決めれていないんじゃない?
もっとよさげな関数は無い?

  • R

ペアの最初の要素にもっと注意を払うべきだよね。

  • L

どのくらい注意を払うべきかな?

  • R

少なくとも2回だね。

  • L

じゃ、こんな感じかな?

(define weight*
  (lambda (pora)
    (cond
     ((atom? pora) 1)
     (else (+ (* (weight* (first pora)) 2)
	      (weight* (second pora)))))))
  • R

うん、いいと思うよ。

5番目のLeftcolumn氏の「ってことは...」の発言の意味が分からん。
その前のRightcolumn氏の発言を受けたものだと思うけど、「alignを評価していく過程で引数の最初の要素が簡単になっていくこと」と「length*が正しくアトムの数を数えていないこと」がどう関連してるのか全く分からん。


っていうか、length*はちゃんとアトムの数を数えているやんか。
なんで最初の要素を2回カウントしなければいけないかまったくもって理解できない。


確かに英語は簡単だし、かわいらしい挿絵も散りばめられてて子供向けな雰囲気を漂わせてますが、能無しな僕は意味を汲み取るのが本当に難しいです。
分からないことが出てきたら、そこで途方に暮れてしまうんですよ。
なぜかって、後から分かり易く言い直したりとかが全くないから。


もう、モチベーション下がりっぱなし。