(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))