Schemeでリストの反転

全然大したことやってませんので、・・・ご忠告までに。
徹夜で履歴書の原案を練っていて、一段落付いたところでブログを見てると、id:higeponさんがSICPの勉強をされていた。そこでリストの反転の問題を解いていたので、自分も今すぐ解けるかどうかやってみた。

gosh>
(define  (rev  list)
    (define  (rev-iter  tl  rl)
        (if  (null?  tl)
             rl
             (rev-iter  (cdr tl)  (cons  (car tl)  rl) ) ) )
    (rev-iter  list  () ) )
rev
gosh>(rev  '(1 2 3 4 5))
(5 4 3 2 1)

成功なのかな。まぁ、いいや。気分転換です。( tl は残りで、rl はすでに反転済み)
ちなみに、Prologがわかる大学の友達に言っておくと、
Prologにおいて、あるリスト(= list)を [ H | TL ] と表現するとき

  • H <-> (car list)
  • TL <-> (cdr list)
  • [ H | TL ] <-> (cons h tl)

という風に対応します。だから、後は関数の中に関数を定義しているだけなので、Prologの知識と考え方を思い出せば理解できると思います。*1
ふわぁ・・・、眠い・・・。

*1:あと、if文は " (if (条件) (真のとき) (偽のとき) ) " で、関数定義は、 " (define (関数名 引数) ... (返り値) ) "