Gauche のリスト処理手続き : 3

呼称: リストの簡単な処理
目的: Gauche のリスト処理の再帰呼び出しに慣れる
備考: car/cdr で再帰呼び出しするのが基本(?)

慣れないうちは「Scheme とこういうものだ」と思って付き合うべし、とあったのでサンプルをそのまま写経して体で覚える。条件や手続きは違っても car/cdr を引数に再起呼び出ししているのが共通点。

(define (last-pair lis)
  (if (pair? (cdr lis))
    (last-pair (cdr lis))
    lis))

(define (copy-list lis)
  (if (pair? lis)
    (cons (car lis) (copy-list (cdr lis)))
    lis))

(define (append2 a b)
  (if (pair? a)
    (cons (car a) (append2 (cdr a) b))
    b))

(define (reverse2 lis)
  (if (null? (cdr lis))
    lis
    (append2 (reverse2 (cdr lis)) (list (car lis)))))

練習問題にチャレンジ。値を返すために初期値を与えているのが冗長っぽい、分からないや(- -#

;; fold を使わずにリストの長さを計算する
(define (length2 lis i)
  (if (null? lis)
    i
    (length2 (cdr lis) (+ 1 i))))

;; リストの中から条件を満たす要素のみのリストを作成する
(define (filter pred lis rlis)
  (cond [(null? lis) rlis]
        [(pred (car lis)) (filter pred (cdr lis) (append rlis (list (car lis))))]
        [else (filter pred (cdr lis) rlis)]))

実行結果。

gosh> (length2 '(1 3 5) 0)
3
gosh> (length2 '(1 3 5.8) 0)
3
gosh> (filter odd? '(9 1 2 8 7 5 4 6) '())
(9 1 7 5)