回答:
#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