2018年7月20日金曜日

delete

 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で変更できるけど。