GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/List-Variables.html ・ emacs-doc.conao3.com

5.5 リスト変数の変更

これらの関数と1つのマクロは、変数に格納されたリストを便利に変更するための手段を提供します。

マクロ: push element listname

このマクロは、CAR が element で、CDR が listname で指定されたリストである新しいリストを作成し、そのリストを listname に保存します。最も単純なケースでは、listname はリスト名を示すクォートなしのシンボルであり、このマクロは (setq listname (cons element listname)) と等価になります。

(setq l '(a b))
     ⇒ (a b)
(push 'c l)
     ⇒ (c a b)
l
     ⇒ (c a b)

より一般的に、listname は一般化変数となり得ます。その場合、このマクロは (setf listname (cons element listname)) と同等の動作を行います。一般化変数 を参照してください。

リストから最初の要素を削除する pop マクロについては、リストの要素へのアクセスを参照してください。

2つの関数が、変数の値であるリストを変更します。

関数: add-to-list symbol element &optional append compare-fn

この関数は、element がまだその値の要素でない場合に、element を古い値に cons することで変数 symbol を設定します。更新の有無にかかわらず、結果として得られたリストを返します。呼び出し前に、symbol の値はすでにリストである必要があります。add-to-list は compare-fn を用いて element を既存のリスト要素と比較し、compare-fn が nil である場合は equal を使用します。

通常、element が追加された場合は symbol の先頭に追加されますが、オプション引数 append が nil 以外の場合は、末尾に追加されます。

引数 symbol は暗黙的にクォートされていません。add-to-list は set と同様に通常の関数であり、setq とは異なります。そのようにしたい場合は、ご自身で引数をクォートしてください。

この関数は、load-path(ライブラリ検索を参照)、image-load-path(画像の定義を参照)などの設定変数に要素を追加するためのものです。そのコードには、これらの用途に関する特殊なチェックがかなり多く含まれており、それらをサポートするための警告を出力します。そのため、任意のリストを構築するためのLispプログラムでこの関数を使用することは推奨しません。代わりにpushを使用してください。リスト変数の変更を参照してください。

symbol が字句変数を参照する場合、この関数は使用しないでください。

add-to-listの使い方を示す例を以下に挙げます。

(setq foo '(a b))
     ⇒ (a b)

(add-to-list 'foo 'c)     ;; Add c.
     ⇒ (c a b)

(add-to-list 'foo 'b)     ;; No effect.
     ⇒ (c a b)

foo                       ;; foo was changed.
     ⇒ (c a b)

(add-to-list 'var value) の同値な表現は次の通りです。

(if (member value var)
    var
  (setq var (cons value var)))
関数: add-to-ordered-list symbol element &optional order

この関数は、リストである必要がある古い値の order で指定された位置に element を挿入することで、変数 symbol を設定します。 element が既にリストの要素である場合、order に従ってリスト内での位置が調整されます。 要素であるかどうかは eq を用いて判定されます。 この関数は、更新の有無にかかわらず、結果として得られたリストを返します。

order は通常数値(整数または浮動小数点数)であり、リストの要素は非減少の数値順にソートされます。

order も省略可能であり、nil も同様です。その場合、element に既に数値順が設定されていればそのまま維持され、そうでなければ element に数値順は設定されません。数値リスト順を持たない要素は、特に順序なくリストの末尾に配置されます。

order にそれ以外の値が指定されている場合、element に既に数値順の指定があればそれが削除されます。そうでない場合は、nil と同等になります。

引数 symbol は暗黙的にクォートされていません。add-to-ordered-list は set と同様に通常の関数であり、setq とは異なります。必要に応じて、引数を自身でクォートしてください。

順序情報はsymbolのlist-orderプロパティにあるハッシュテーブルに格納されています。symbolは字句変数を参照することはできません。

add-to-ordered-listの使い方を示す例を以下に挙げます。

(setq foo '())
     ⇒ nil

(add-to-ordered-list 'foo 'a 1)     ;; Add a.
     ⇒ (a)

(add-to-ordered-list 'foo 'c 3)     ;; Add c.
     ⇒ (a c)

(add-to-ordered-list 'foo 'b 2)     ;; Add b.
     ⇒ (a b c)

(add-to-ordered-list 'foo 'b 4)     ;; Move b.
     ⇒ (a c b)

(add-to-ordered-list 'foo 'd)       ;; Append d.
     ⇒ (a c b d)

(add-to-ordered-list 'foo 'e)       ;; Add e.
     ⇒ (a c b e d)

foo                       ;; foo was changed.
     ⇒ (a c b e d)