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)
(=> (A (5 B C) D)
x pushnew 'b (cadr x)) => (5 B C)
(=> (A (5 B C) D)
x 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
の前に評価されます。