ネストしたリストの操作

メモです。

flatten

(define (flatten ls)
  (cond ((null? ls) '())
        ((pair? ls)
         (append (flatten (car ls)) (flatten (cdr ls))))
        (else (list ls))))
(define (flatten a)
 (if (list? a) (apply append (map flatten a))
   (list a))) 

なかなか変態なコードですよね。

deep-copy-list

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

やりたかったのは

Gauche本、P66とかにリストの構造を保ったまま全ての要素を2倍する、とかがあったのでリストをflatにして2倍とかしようとか考えた。が、電車プログラミングの中ではできなかったので、帰宅後ググる。結局上のflatternが作れなかった、ということであった。

(map (lambda (x) (* 2 x)) (flatten '(1 2 3 (4 5 6))))

一箇所に再帰適用とかは分かるけど、二箇所とかはまだよく分からーん。