Hatena::Groupcadr

kozima の日記

2009-07-19

(SETF NTHCDR)

| 19:48

nthcdr に setf したいことはときどきあるんですが、標準ではできません。

で、作ろうとするとまず考えることは

(setf (cdr (nthcdr (1- n) foo)) 'bar)

みたいに展開すればいいのかなということなんですが、こうすると n=0 のときに困ります。*1

より意図に近いコードはおそらく

(if (plusp n)
    (setf (cdr (nthcdr (1- n) foo)) 'bar)
    (setf foo 'bar))

だと思うので、こんなふうに展開されるようにすればいいような気もしますが、どうなのでしょう。これくらいのことを思いつく人はたくさんいそうで、その中には実際に作ってみようと考える人もそれなりにいると思うので、探せばコードまたは問題点を指摘した文書が見つかるのではないかと思いますが。

*1:だから setf method がないのかなあと思ったことがあります