ふと思いついたのでCPS

リスト構造の中のノード数を数える手続きを考える.

(define node-count
  (lambda (tree)
    (if (pair? tree)
	(+ 1 (node-count (car tree)) (node-count (cdr tree)))
	1)))

当然末尾再帰になってないからスタックがあふれる.

これをCPSに変換するのはちょっとめんどくさい上に読みづらい.

(define node-count-cps
  (letrec ((node-count-iter
	    (lambda (tree k)
	      (if (pair? tree)
		  (node-count-iter (car tree)
				   (lambda (x)
				     (node-count-iter (cdr tree) (lambda (y) (k (+ 1 x y))))))
		  (k 1)))))
    (lambda (tree)
      (node-count-iter tree (lambda (x) x)))))

どうにかならんのやか?