[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:06496] Re: setf フォームの定義の仕方



亀井さん、こんにちは。
	
        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

Index Home