1

いくつかの記号と値を含むリストがあります。目標は、シンボルが list によって提供されるアクセサでクラス スロットを設定することです。

(defclass my-class ()
 ((attr :accessor attr)))

(let ((to-call '(attr "some-value"))
      (obj (make-instance 'my-class)))
 (setf `(,(car to-call) obj) (cadr to-call)))

私はマクロを介して試しました:

(defmacro call-accessor (to-call)
 `(setf (,(car to-call) obj) "some-value"))

(let ((to-call '(attr "some-value"))
      (obj (make-instance 'my-class)))
 (call-accessor to-call))

to-callリストではなくシンボルであるため、これも失敗します。

  • evalto-callは字句変数であるため機能しません。
  • letリストを与えるためにマクロを上書きすることはできません。
  • with-slotsandを試してみましwith-accessorsたが、それらもマクロであるため、問題は同じままです。
  • 他のマクロを宣言するマクロや、シンボルマクロレットも検討しました。

リスト内のシンボルに対応するアクセサを介してスロットを設定するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3