[xyzzy:06496] Re: setf フォームの定義の仕方
- Subject: [xyzzy:06496] Re: setf フォームの定義の仕方
- From: aizawa minoru <maizawa@xxxxxxxxxxxxxxxxxxxx>
- X-mailer: Becky! ver. 2.00.03
亀井さん、こんにちは。
2001/03/26(Mon) 16:08:11 の
[xyzzy:06493] Re: setf フォームの定義の仕方
への返事です。
> setf 系は静的な呼び出ししか展開できません。格納先を動
> 的に切り替えたい場合は、こうするしかないんじゃないでし
> ょうか。
>
> (let ((x '(0 . 1))
> (key #'(lambda (x n) (incf (car x) n))))
> (funcall key x 10)
> x)
どうもありがとうございます。
やりたかったことは、下のようなことだったのですが、
incfする個所(car x)だけを明示する方法はダメそうですね。
マクロを使って実装してみます。
(defun set-sum-if-exist (l dic &key
(dic-key #'identity)
(search-add-value #'identity)
(dic-add-value #'identity)
search-test
search-test-not
(search-key #'identity))
(dolist (x l dic)
(let* ((x-dic-key (funcall dic-key x))
(y (assoc x-dic-key dic
:test search-test
:test-not search-test-not
:key search-key)))
(when y
(incf (funcall search-add-value y) (funcall dic-add-value x))))))
(let ((dic '(("01" "伊藤" 0 0)))
(datum '(("01" "1/1" 1000)
("01" "1/2" 2000))))
(set-sum-if-exist datum
dic
:dic-key #'car
:search-test #'string=
:search-add-value #'caddr
:dic-add-value #'caddr))
結果→(("01" "伊藤" 3000 0))
--
相沢実(Minoru Aizawa)
maizawa@xxxxxxxxxxxxxxxxxxxx