回答:
#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'.
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)それでもエラーが発生します- 5関数ではありません。これはadd-to-listの動作とどう違うのですか?
(5 6)を場所(変数の値)にプッシュする場合は、リストmy-listを作成する必要があります(5 6)。それを行う1つの方法は、使用すること'(5 6)です。別の方法はを使用すること(list 5 6)です。push引数を評価します。
pushは、変数などの場所です。最初のargが評価され、その変数の値に結びつけられ、変数はその新しいconsに設定されます。add-to-list最初の引数を評価して、値が更新される変数を生成します。push更新する変数である2番目の引数を評価しません。argの順序は2つの間で逆になります。
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ます。
add-to-listしたコードからを使用したコードへの変換に苦労していcl-pushnewましたが、このブログ投稿は非常に啓発的であることがわかりました。yoo2080.wordpress.com/ 2013