Common lisp 在Common LISP中从结构本身访问结构字段

Common lisp 在Common LISP中从结构本身访问结构字段,common-lisp,Common Lisp,对于我的项目,我特别需要一个具有(除其他外)2个插槽的结构: 一个保存数据(当前状态、结构) 一个人拥有一个功能(即状态-解决方案) 该函数槽必须评估当前状态并返回基于该状态的结果。然而,我找不到如何正确地做到这一点。这是我的一段代码 (defstruct state moves-left) (defstruct problem (current-state) (solution (function (lambda () (null (state-moves-left :c

对于我的项目,我特别需要一个具有(除其他外)2个插槽的结构:

  • 一个保存数据(当前状态、结构)
  • 一个人拥有一个功能(即状态-解决方案)
该函数槽必须评估当前状态并返回基于该状态的结果。然而,我找不到如何正确地做到这一点。这是我的一段代码

(defstruct state moves-left)

(defstruct problem
    (current-state)
    (solution (function (lambda () (null (state-moves-left :current-state)))))
)
编译时没有错误,但在我解释时会发生错误:

> (setq p0 (make-problem :current-state (make-state)))
> (funcall (problem-solution p0))

SYSTEM::%STRUCTURE-REF: :CURRENT-STATE is not a structure of type STATE
有人知道怎么解决这个问题吗?我通常只使用普通函数,但这些结构和插槽是硬需求


编辑:谢谢你的回答。在了解到这是不可能的之后,我更彻底地重新阅读了需求并发布了答案。

错误的原因是Common Lisp中的结构不能用作类:在slot
解决方案的函数默认值内,无法引用结构本身的slot(正如您试图使用
(状态向左移动:当前状态)

如果坚持使用结构而不是类,一种可能性是使用参数定义函数,并在调用函数时传递结构本身。类似于:

(defstruct problem
    (current-state)
    (solution (function (lambda (p) (null (state-moves-left p))))))

(let ((p0 (make-problem :current-state (make-state))))
  (funcall (problem-solution p0) p0))
您可以有一个单独的创建函数:

(defun create-problem (state)
  (let ((problem (make-problem :current-state state)))
    (setf (problem-solution problem)
          (lambda ()
            (null (state-moves-left (problem-current-state problem)))))
    problem))
但是:为什么不直接使用函数/方法呢

(defmethod problem-solution ((p problem))
  (null (state-moves-left (problem-current-state p))))

在了解到这是不可能的之后,我更彻底地重新阅读了需求,发现这个函数实际上会收到一个参数(一个状态)

(解构问题) (当前状态) (解决方案(函数(lambda(state)(非(null)(state向左移动状态‘‘‘‘)’))
)

回顾过去几年,不接触Lisp,这个问题看起来非常令人困惑。。。