number?
関数 number? は引数が数のアトムなら真で、そうでなければ偽になる。number? は Scheme では書くことができない基本関数だと紹介されている。実際、Gahche には組み込みで存在する。
gosh> (number? 5) #t gosh> (number? 'a) #f
さて、今回の課題はここから。まずは no-nums。
no-nums
no-nums はラットからすべての数を取り除いたものを返す。
(define no-nums
(lambda (lat)
(cond
((null? lat) (quote ()))
((number? (car lat)) (no-nums (cdr lat)))
(else (cons (car lat) (no-nums (cdr lat)))))))
(print (no-nums '(5 pears 6 prunes 9 dates)))
(number? (car lat)) が真なら (car lat) を cons せずに再帰し、そうでなければ cons して再帰している。ま、そんなに難しくない。
実行:
^o^ > gosh no-nums.scm (pears prunes dates)
all-nums
all-nums は no-nums とは逆に、ラットからすべての数を取り出してタップを作る。
no-nums ができているんだから簡単。cons する条件を逆にするだけだ。
(define all-nums
(lambda (lat)
(cond
((null? lat) (quote ()))
((number? (car lat)) (cons (car lat) (all-nums (cdr lat))))
(else (all-nums (cdr lat))))))
(print (all-nums '(5 pears 6 prunes 9 dates)))
実行:
^o^ > gosh all-nums.scm (5 6 9)