練習問題してみるか

色々な意味で微妙な状態なんですが、せっかく来たのでナニ。

問題 1.41

まず試験書くか。

(use gauche.test)

(add-load-path ".")
(load "double")

(test-start "double")
(test-section "double")
(test* "((doubld inc) 1)"
       3
       ((double inc) 1))

(test-end)

試験パス。設問は

(((double (double double)) inc) 5)

な式が戻す値は何? ってコトなんですが、まず (double double) が戻すのは

(lambda (x)
  ((lambda (x) (f (f x))) ((lambda (x) (f (f x)) x))))

うーん、見にくい。こうして良いのかなぁ。

(lambda (x)
  (f (f (f (f x)))))

あら? これ、違うな。ちょっとアタマがこんがらがってきた。

冷静に

ええと、(double double) が戻すのは

(lambda (x) (double (double x)))

ではマズいな。ええと、double は 1 引数の手続きをを 2 回作用させる手続きを戻す手続き、だから上記で良いのか。だから以下の試験はパスなんだな。

(test* "(((double double) inc) 5)"
       9
       (((double double) inc) 5))

上記は x に inc が渡されて、以下に展開されるはず。

(lambda (x) (inc (inc (inc (inc x)))))

あるいは (double double) が戻す手続きをさらに double に渡すと?

(lambda (x) (double (double (double (double x)))))

これに inc を渡すと 16 回 inc する手続きが戻るはず。

(test* "example"
       21
       (((double (double double)) inc) 5))

軽くパニクりそうになってしまった。次の問題はオンラインでドッキングしてから、になれば良いですが。。