listを操作する関数で破壊的なものはあまり使う気になれなかった。意外なところに影響がでたりするからだ。でもsetfは便利だな、と思っていて、そういえば、listの一部だけ削除するにはどうしたらいいんだろう。
deleteを見つけて色々、試してみて思った。
これってassocと組み合わせるとすごくね?
CL-USER> wrk ((1 2) (3 4) (5 6)) CL-USER> (delete (assoc 3 wrk) wrk) ((1 2) (5 6)) CL-USER> wrk ((1 2) (5 6)) CL-USER>
RDBみたいじゃん。
deleteのような破壊的関数ではなく、removeというのもあった。
CL-USER> wrk ((1 2) (3 4) (5 6)) CL-USER> (setq wrk2 (remove (nth 1 wrk) wrk)) ((1 2) (5 6)) CL-USER> wrk ((1 2) (3 4) (5 6)) CL-USER> wrk2 ((1 2) (5 6)) CL-USER>
もしかしたら、と思って試してみたら。
wrkとwrk2の要素は共有されていた。
CL-USER> (setf (caar wrk2) 123) 123 CL-USER> wrk ((123 2) (3 4) (5 6)) CL-USER> wrk2 ((123 2) (5 6))
おもしろい。
elispでも同じことができるけど、deleteの比較はequalだった。eqのものはdelq。CommonLispはどうやらeqらしい。:testで変更できるけど。