6章の最後に、空リストで数を表現するという面白いのが出てくる。
たとえば 0 は ()、1 は (())、2 は (() ()) という具合だ。この数の表現を使っていくつか関数を書いてみよう。
まずは、ゼロかどうかを調べる関数。
gosh> (define sero?
(lambda (n)
(null? n)))
sero?
gosh> (sero? '())
#t
gosh> (sero? '(()))
#f
つぎに、add1 に相当する関数。
gosh> (define edd1
(lambda (n)
(cons (quote ()) n)))
edd1
gosh> (edd1 '())
(())
gosh> (edd1 '(() ()))
(() () ())
sub1 に相当する関数。
gosh> (define zub1
(lambda (n)
(cdr n)))
zub1
gosh> (zub1 '(() ()))
(())
gosh> (zub1 '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________
ゼロ () に zub1 を適用したらエラーになった。0 以上の整数しか扱えないんだな。