next up previous
Next: 3.6 リスト構造を変更する置換 nsubst Up: 3 リスト構造の変更 Previous: 3.4 delete

3.5 置換した形のコピーを作る subst

substは,第3引数のデータ中にある第二引数のデータを第一引数のデータで 置き換えるという関数です.
(subst 'a 'b '(a b c))
(a a c)
(subst 'a 'b '(b a c a b a))
(a a c a a a)
(subst '10 'b '(b a c a b a))
(10 a c a 10 a)
(subst '10 'a '(b a c a b a))
(b 10 c 10 b 10)
(subst '10 '(a) '(b a (a) ((a))))
(b a (a) ((a)))
(subst '10 '(a) '(b a (a) ((a))) :test #'equal)
(b a 10 (10))
(subst 'a '(b) '((a) (b) b ((c b) ((b) c d b))))
((a) (b) b ((c b) ((b) c d b)))
(subst 'a '(b)
            '((a) (b) b ((c b) ((b) c d b)))
            :test #'equal)
((a) a b ((c . a) (a c d . a)))
この例では,内部での比較を行う手続きを 引数:testの後に与えることによって比較処理を 変更することができるようにsubstが定義されて いる. ここでは,equalでデータ比較を行うmy-substを 定義してみると以下のようになる.
(defun my-subst (new old data)
  (cond
      ((atom data)
       (if (equal old data) new data))
    ((equal old (car data))
     (cons new (my-subst new old (cdr data))))
    (t (cons (my-subst new old (car data))
	     (my-subst new old (cdr data))))))

(my-subst 'a 'b '(a b c))
(a a c)
(my-subst 'a 'b '(b a c a b a))
(a a c a a a)
(my-subst '10 'b '(b a c a b a))
(10 a c a 10 a)
(my-subst '10 'a '(b a c a b a))
(b 10 c 10 b 10)
(my-subst '10 '(a) '(b a (a) ((a))))
(b a 10 (10))
(my-subst 'a '(b) '((a) (b) b ((c b) ((b) c d b))))
((a) a b ((c b) (a c d b)))
リスト全体をコピーする関数としては,copy-list(トップレ ベルのみのコピー), copy-alist(トップレベルのコンスのみ), copy-tree(トップレベルだけでなく内部も)というものがある.
(defun list-copy (sexp)
  (if (atom sexp)  sexp
    (cons (car sexp)
          (list-copy (cdr sexp)))))
という形に定義できるが,substで以下のような 定義も可能である.
(defun list-copy (a) (subst t t a))


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