next up previous
Next: 5.3 置換した形のコピーを作る subst Up: 5 リストを変形する操作 Previous: 5.1 リストを変形する基本操作rplaca, rplacd

5.2 連結操作によりリストを変形する関数 nconc

> (setq x '(1 2 3) y '(4 5 6))
(4 5 6) 
> (setq z (append x y))
(1 2 3 4 5 6) 
> x
(1 2 3) 
> y
(4 5 6) 
> z
(1 2 3 4 5 6) 
> (setq w (nconc x y))
(1 2 3 4 5 6) 
> x
(1 2 3 4 5 6) 
> y
(4 5 6) 
> w
(1 2 3 4 5 6) 
>
以下のnconcとappendの定義の違いを見て理解してください.
(defun nconc* (a &rest args)
  (cond
    ((null args) a)
    (t (apply
         #'nconc*
         (cons
           (nconc2 a (car args))
           (cdr args))))))
(defun nconc2 (a b)
  (rplacd (last a) b) a)

(defun last (x)
  (if (null (cdr x)) x (last (cdr x))))

(defun append* (&rest args)
  (cond  ((null args) nil)
         (t (apply 
             #'append2
               (car args)
               (apply #'append (cdr args))))))
(defun append2 (a b)
  (if  (null a) b
       (cons (car  a) (append2 (cdr a) b))))


generated through LaTeX2HTML. M.Inaba 平成18年5月6日