計算機プログラムの構造と解釈 第二版 P63 問題2.27

題意としては、
・深いとこまでreverseしちゃう手続き、deep-reverseを定義


出力する値の例は問題に乗っているので割愛。


ちょっと本気で考えて、append使わない版もつくってみたよ。


んでは、実装

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

;;2.18
(define (reverse items) 
  (define (reverse-in vs result)
    (if (null? vs)
      result
      (reverse-in (cdr vs) (cons (car vs) result))))
  (reverse-in items nil))

 
(define (reverse items)
  (if (null? items)
    items
    (append (reverse (cdr items)) (list (car items)))))

(define (deep-reverse items)
  (if (pair? items)
    (append (deep-reverse (cdr items)) (list (deep-reverse (car items))))
                  items))

(define (deep-reverse2 items)
  (define (reverse-in vs result)
    (if (null? vs) 
      result
      (if (pair? (car vs))
        (reverse-in (cdr vs) (cons (deep-reverse2 (car vs)) result))
        (reverse-in (cdr vs) (cons (car vs) result)))))
  (reverse-in items nil))

(define nil '())

(define x (list (list 1 2) (list 3 4)))

;; main
(define (main args)

  (display "x: ")
  (display x)
  (newline)


  (display "(reverse x): ")
  (display (reverse x))

  (display "(deep-reverse x): ")
  (display (deep-reverse x))
  (newline)

  (display "(deep-reverse2 x): ")
  (display (deep-reverse2 x))
  (newline)

 0)

実行

x: ((1 2) (3 4))
(reverse x): ((3 4) (1 2))
(deep-reverse x): ((4 3) (2 1))
(deep-reverse2 x): ((4 3) (2 1))


うす。