编译Common Lisp代码时出现奇怪的错误

时间:2017-05-31 14:28:58

标签: common-lisp clos

尝试编译代码时出现以下错误:

  

方法#的Lambda列表与泛型函数的列表不兼容   INITIALIZE-INSTANCE。方法的lambda-list:(PAT :: E)   通用功能:(CCL :: INSTANCE& REST CCL :: INITARGS& KEY                           &安培; ALLOW-OTHER-KEYS)

以下是导致错误的代码:

(defclass event ()
  ((timestamp
    :initarg :timestamp
    :accessor timestamp)
   (value
    :initarg :value
    :accessor value)))

(defclass update (event)
  ((security
    :initarg :sectype
    :accessor sectype)))

(defclass prc (update)
  ((lastp
    :accessor lastp)
   (lastv
    :accessor lastv)))

(defmethod initialize-instance :after ((e prc)) ; <- :(
  (setf (lastp e) (first (value e)))
  (when (second (value e))
    (setf (lastv e) (second (value e)))))

任何可能导致错误的提示都会非常感激。

1 个答案:

答案 0 :(得分:4)

您需要在参数列表末尾添加&keyinitialize-instance方法。

引用“Practical Common Lisp”,“17. Object Reorientation:Classes”一章:

  

参数列表中的&key是保持方法的参数列表与泛型函数一致的必要条件 - 为INITIALIZE-INSTANCE泛型函数指定的参数列表包括&key以便允许单个方法提供自己的关键字参数,但不需要任何特定的方法。因此,即使没有指定任何&key参数,每个方法也必须指定&key