Common Lispには、戻り値を作り出すために元々の構造を破壊する関数があります。
sort、stable-sort を除く破壊的な関数には対応する非破壊的な関数があるので、基本的には非破壊版を利用しておいたほうが良さそうです。
なお、破壊的関数の先頭に付く n は non-consing の略だそうです。
詳しくは 実践Common Lispの12章 あたりを見ると良いでしょう。
非破壊的 | 破壊的 | 概要 |
sort | ソート | |
stable-sort | 安定ソート | |
reverse | nreverse | リストの反転 |
append | nconc | リストの結合 |
revappend | nreconc | リストの結合 |
butlast | nbutlast | リストの末尾以外取得 |
remove | delete | シーケンスの要素削除 |
remove-if | delete-if | 条件に一致する要素削除 |
remove-if-not | delete-if-not | 条件に一致しない要素削除 |
remove-duplicates | delete-duplicates | 重複を削除 |
union | nunion | 和集合 |
intersection | nintersection | 積集合 |
set-difference | nset-difference | 差集合 |
set-exclusive-or | nset-exclusive-or | 対称差 |
string-capitalize | nstring-capitalize | 単語の先頭を大文字、それ以外を小文字に変換 |
string-downcase | nstring-downcase | 文字列を小文字に変換 |
string-upcase | nstring-upcase | 文字列を大文字に変換 |
subst | nsubst | 木構造(リスト)の要素を変更 |
subst-if | nsubst-if | 木構造(リスト)の要素を変更 |
subst-if-not | nsubst-if-not | 木構造(リスト)の要素を変更 |
sublis | nsublis | 木構造(リスト)の要素を変更 |
substitute | nsubstitute | シーケンスの要素を変更 |
substitute-if | nsubstitute-if | シーケンスの要素を変更 |
substitute-if-not | nsubstitute-if-not | シーケンスの要素を変更 |