List (3/3)


リストを扱う関数の例

car, cdr を用いることでリストの要素に触ることが出来るので、 n 番目の要素を返す nth や、 リストを逆転させる my-reverse を 以下のように再帰を用いて定義する事もできます。

リスト操作はそもそも再帰的な操作が多いので、 car, cdr を使って自然に記述する事が出来ます。


;;; (nth n x) は x の n 番目の要素を返す
(define (nth n x)
  (if (= n 0)         ;;; n が 0 なら、リストの先頭を返し
      (car x)
      (nth (- n 1) (cdr x))))  ;;; でなきゃ、残りのリストの n-1 番目を返す

;;; my-reverse-iter for my-reverse
;;; from が空になるまで、from から要素を取り出して、to に詰める
(define (my-reverse-iter from to)  
  (if (null? from)              
      to
      (my-reverse-iter (cdr from) (cons (car from) to)))) ;;;

(define (my-reverse x)
  (my-reverse-iter x (list)))
-----
> (nth 3 (list 0 1 2 3 4 5))
3
> (my-reverse (list 'a 'b 'c))
(c b a)
この処理系が提供しているリストにまつわる関数も色々あります。 nthmy-reverse は、 list-ref, reverseという名前ではじめから提供されています。 こちらで紹介しています。

99.10.5/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp