next up previous
Next: 4 リストの編集プログラム Up: 3 リスト構造の変更 Previous: 3.9 データの置換

3.10 括弧を付けたり,はずしたりする関数

いくつかの要素をまとめてひとつのリストにしたり,逆にリストの要素を展開 するという操作は,直観的には括弧をつけたりはずしたりする操作といえる.

<cl> (setq a '(1 2 3 4 5 6 7))
(1 2 3 4 5 6 7) 
<cl> (nth-enclose 1 3 a)
(1 (2 3 4) 5 6 7) 
<cl> a
(1 (2 3 4) 5 6 7) 
<cl> (nth-extend 1 a)
(1 2 3 4 5 6 7) 
<cl> a
(1 2 3 4 5 6 7)
このような振舞いをするnth-enclose, nth-extendという関数は, 以下のように定義できる.
(defun nth-enclose (from to sexp)
  (when (>= to from 0)
        (let ((m (copy-tree (nthcdr from sexp))))
          (rplacd (nthcdr (- to from) m) nil)
          (rplaca (nthcdr from sexp) m)
          (rplacd
           (nthcdr from sexp)
           (nthcdr (1+ to) sexp))
          sexp)))
(defun nth-extend (nth sexp)
  (let ((m (nth nth sexp)))
    (if (consp m)
        (progn (rplacd
                (nthcdr (1- (length m)) m)
                (nthcdr (1+ nth) sexp))
               (setq m (nthcdr nth sexp))
               (rplacd m (cdar m))
               (rplaca m (caar m))
               sexp))))


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