Macro PUSHNEW
pushnew item place &key key test test-not
=> new-place-value
item - オブジェクト
place - place、通常のリストの値
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
key - 1つの引数を取りgeneralized-booleanを返却する関数の指定子、 またはnil
new-place-value - リスト(placeの新しい値)
pushnewは、itemと同じものが、 placeのリストの既存の要素にあるかどうかをテストします。 もしitemが既存の要素に存在しないときは、 リストの前に配置し、新しいリストをplaceに保存します。
pushnewは、placeに格納された新しいリストを返却します。
itemがすでにplaceのリストのメンバーかどうかは、 :testか:test-notが比較に使用されて決定します。 :testか:test-notの関数の最初の引数はitemであり、 二番目の引数はplaceのリストの要素であり、 :keyが指定されていればその関数の返却値が使われます。
もし:keyが指定されていれば、adjoinのように、 itemとリストの要素両方からテストの部分を引き出すために使われます。
:key関数の引数は、placeに格納されたリストの要素です。 :key関数のは、通常はリストの要素の部分を返却します。 もし:keyが指定されなかったか、あるいはnilのときは、 リストの要素が使用されます。
placeのサブフォームの評価についての情報は、 5.1.1.1. placeのサブフォームの評価をご確認ください。
itermがすでにplaceのリストのメンバーであった場合に、 pushnewが実際にplaceに対して 格納フォームを実行するかどうかは実装依存です。
(setq x '(a (b c) d)) =>  (A (B C) D)
(pushnew 5 (cadr x)) =>  (5 B C)   
x =>  (A (5 B C) D)
(pushnew 'b (cadr x)) =>  (5 B C)  
x =>  (A (5 B C) D)
(setq lst '((1) (1 2) (1 2 3))) =>  ((1) (1 2) (1 2 3))
(pushnew '(2) lst) =>  ((2) (1) (1 2) (1 2 3))
(pushnew '(1) lst) =>  ((1) (2) (1) (1 2) (1 2 3))
(pushnew '(1) lst :test 'equal) =>  ((1) (2) (1) (1 2) (1 2 3))
(pushnew '(1) lst :key #'car) =>  ((1) (2) (1) (1 2) (1 2 3)) placeの内容は修正されるでしょう。
なし。
なし。
下記の効果は、
(pushnew item place :test p)だいたい次と同等です。
(setf place (adjoin item place :test p))ただし、placeのサブフォームはただ一度だけ評価され、 itemはplaceの前に評価されます。