2018年7月22日日曜日

setf

 setfではassocを使えないんだね1

CL-USER> wrk
((1 2) (3 4) (5 6))
CL-USER> (setf (assoc 3 wrk) 123)
; Evaluation aborted on #<UNDEFINED-FUNCTION (SETF ASSOC) {1003D452D3}>.
CL-USER>

 でもこうすると、中身を変更できるんだ。

CL-USER> wrk
((1 2) (3 4) (5 6))
CL-USER> (setf (cadr (assoc 3 wrk)) 99)
99
CL-USER> wrk
((1 2) (3 99) (5 6))
CL-USER>

 これまた、RDBっぽい。
 ちなみにまちがって下記のように書いたらSBCLは即エラーになったけれど、ABCLは永久ループにはまりこんでしまった。

CL-USER> wrk
((1 2) (3 4) (5 6))
CL-USER> (setf (cadr (assoc 3 wrk)) wrk)

 elispはどうだろう。

(setf wrk '((1 2)(3 4)(5 6)))
((1 2) (3 4) (5 6))
(setf (cadr (assoc 3 wrk)) wrk)
((1 2) (3 #0) (5 6))
wrk
((1 2) (3 #0) (5 6))

 なんじゃ?

Footnotes:

1

setfできるassocがalexandriaにあるらしい。