SICP 問題 2.44(up-splitを定義)

問題

corner-split で使った手続き up-split を定義せよ。below と beside の働き切り替える他は right-split と同様である。

解答

corner-split と right-split は直前に記載されているのでここに掲載しておこう。

(define (corner-split painter n)
  (if (= n 0)
      painter
      (let ((up (up-split painter (- n 1)))
	    (right (right-split painter (- n 1))))
	(let ((top-left (beside up up))
	      (bottom-right (below right right))
	      (corner (corner-split painter (- n 1))))
	  (beside (below painter top-left)
		  (below bottom-right corner))))))

(define (right-split painter n)
  (if (= n 0)
      painter
      (let ((smaller (right-split painter (- n 1))))
	(beside painter (below smaller smaller)))))

で、up-split は right-split を参考にすればいいんだからこんな感じ。
あ、below は第1引数が下側、第2引数が上側になるので気をつけよう。これは corner-split を見れば分かる感じ。
(※SICPに記載されている、corner-split 以外の他の below の使い方をみてもわからんかった。)

(define (up-split painter n)
  (if (= n 0)
      painter
      ;再帰呼び出しは自分を呼び出すように修正
      (let ((smaller (up-split painter (- n 1))))
	;まず上下に分けて、更に上側を横方向に分けて smaller を呼び出す。
	(below painter (beside smaller smaller)))))

確認の仕方がわからねぇな。そのうち painter を作るだろうからそんときに確認すっか。