【问题标题】:CLOS: convert symbol to accessorCLOS:将符号转换为访问器
【发布时间】:2015-07-03 18:28:43
【问题描述】:

我猜这是一个真正的初学者问题,但我在这里找不到答案。 我的问题:我想像这样设置一个类的插槽的值:

(setf (accessor class) value)

为此我写了一个小函数:

(defun set-class-slots (class slot value)
      (setf (slot class) value))

我在 for 循环中使用它,在其中我正在迭代 2 个列表(槽(符号列表)和值(数字列表)),并希望将实例的多个槽设置为价值。

(loop for slot in slots for value in values do
      (set-class-slots <myclass> slot value)
      )

我得到的错误是:

“未定义的运算符 (setf slot) 形式为 ((setf slot) #:|Store-Var-773597|#:g773598。”

我认为问题在于我的函数中的 setf 没有使用为输入 arg 提供的值。 'slot' 但将 'slot' 读取为运算符。

我尝试了不同的东西,符号函数、函数调用等,但不知道该怎么做——因为我也不太明白出了什么问题。

任何帮助将不胜感激。

谢谢, 马利诺

【问题讨论】:

  • 有什么理由不使用SLOT-VALUE
  • 我在一个基于 lisp 的环境中工作,不幸的是,我需要修改的类 SLOT-VALUE 不起作用(即 slot 保持未修改)。
  • 那是什么环境?它是一个 Common Lisp 实现吗?如果没有,请相应地更新问题的标签。

标签: common-lisp symbols accessor clos


【解决方案1】:

您可以使用FDEFINITION 来获取(setf XXX) 函数的函数值:

(defun set-class-slots (class slot value)
    (funcall (fdefinition `(setf ,slot)) value class))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多