Next: 3.6 リスト構造を変更する置換 nsubst
Up: 3 リスト構造の変更
Previous: 3.4 delete
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日