next up previous
Next: 5.9 データの探索 Up: 5 リストを変形する操作 Previous: 5.7 データの置換

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

いくつかの要素をまとめてひとつのリストにしたり,逆にリストの要素を展開 するという操作は,直観的には括弧をつけたりはずしたりする操作といえます.
> (setq a '(1 2 3 4 5 6 7))
(1 2 3 4 5 6 7) 
> (nth-enclose 1 3 a)
(1 (2 3 4) 5 6 7) 
> a
(1 (2 3 4) 5 6 7) 
> (nth-extend 1 a)
(1 2 3 4 5 6 7) 
> 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月6日