空リストで数を表現する

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 以上の整数しか扱えないんだな。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください