プッシュとリストへの追加の違いは何ですか?


26

インストール手順のさまざまなパッケージがプッシュまたはリストへの追加のいずれかを使用していることがわかりました(たとえば、ディレクトリをload-pathに追加するなど)。違いは何で、それぞれのユースケースはどうなるのでしょうか。


1
を使用add-to-listしたコードからを使用したコードへの変換に苦労していcl-pushnewましたが、このブログ投稿は非常に啓発的であることがわかりました。yoo2080.wordpress.com/ 2013
/

回答:


21

#zckが言及しているのは、1つの違いです。しかし、それが唯一の違いであるなら、あなたはcl-pushnewそしてについて尋ねることができますadd-to-list

もう1つの重要な違いadd-to-listは、関数です。つまり、すべての引数、特に最初の引数を評価します。pushマクロは(そのままcl-pushnew)-2 番目の引数を評価しません。代わりに、それを一般化された場所として解釈します。

たとえば、2番目の引数がシンボルである場合、それは変数と見なされ、最初の引数の値はそのシンボルの値に変数として結合され、変数はその新しいconsに設定されます。

のドキュメント文字列がadd-to-list言うように:

This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.

6
また、バイトコンパイラによると:add-to-list can't use lexical var ...; use push or cl-pushnew
マラバルバ

(push (5 6) my-list)それでもエラーが発生します- 5関数ではありません。これはadd-to-listの動作とどう違うのですか?
markasoftware

@markasoftware:何をしようとしていますか?リスト(5 6)を場所(変数の値)にプッシュする場合は、リストmy-listを作成する必要があります(5 6)。それを行う1つの方法は、使用すること'(5 6)です。別の方法はを使用すること(list 5 6)です。push引数を評価します。
ドリュー

@Drewは、引数を評価すると言いましたが、答えは文字通り「最初の引数を評価しません」と述べており、これが私の混乱の原因です。
markasoftware

@markasoftware:ごめんなさい。タイプミスがありました-「2番目の引数」を書くべき場所に「1番目の引数」を書きました。今修正-ありがとう。2番目の引数pushは、変数などの場所です。最初のargが評価され、その変数の値に結びつけられ、変数はその新しいconsに設定されます。add-to-list最初の引数を評価して、値が更新される変数を生成します。push更新する変数である2番目の引数を評価しません。argの順序は2つの間で逆になります。
ドリュー

15

別の違い:

pushlistの先頭に要素を追加します

add-to-listリストの最初または最後に要素を追加できます。

(setq testasdf nil)

(push 'a testasdf)

testasdf
(a)

(add-to-list 'testasdf 'b)

testasdf
(b a)

;; add element to the end
(add-to-list 'testasdf "hello" t)

testasdf
(b a "hello")

14

Emacsのドキュメントから、またはC-h f push

マクロ:要素リスト名をプッシュ

このマクロは、carが要素でcdrがlistnameで指定されたリストである新しいリストを作成し、そのリストをlistnameに保存します。

同じページから、またはC-h f add-to-list

機能:リストに追加するシンボル要素とオプションのappend compare-fn

この関数は、要素がまだその値のメンバーでない場合、要素を古い値に結合することにより変数シンボルを設定します。

そのadd-to-listため、要素がまだない場合にのみプッシュします。


cl-pushnewのように動作しadd-to-listます。
サムブーサリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.