首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用下一个最特定的方法不起作用

调用下一个最特定的方法不起作用
EN

Stack Overflow用户
提问于 2017-06-18 09:25:24
回答 1查看 120关注 0票数 0

考虑account类:

代码语言:javascript
复制
(defclass account ()
  ((name :initarg :name :reader name)
   (balance :initarg :balance :initform 0.00 :accessor balance)
   (interest-rate :allocation :class :initform 0.06
                  :reader interest-rate)))

对于这个类,我们定义了一个方法withdraw

代码语言:javascript
复制
(defmethod withdraw ((acct account) amt)
  (if (< amt (balance acct))
      (decf (balance acct) amt)
      'insufficient-funds))

另一个类password-account,是account的一个子类。

代码语言:javascript
复制
(defclass password-account (account)
  ((password :initarg :password :reader password )))

并且,这个类的方法withdraw

代码语言:javascript
复制
(defmethod withdraw ((acct password-account) amt pass)
  (if (equal (password acct) pass)
      (call-next-method acct amt )
      'wrong-password))

但这给出了一个错误:

代码语言:javascript
复制
The generic function
#<STANDARD-GENERIC-FUNCTION COMMON-LISP-USER::WITHDRAW (1)>
takes 2 required arguments; was asked to find a method with
specializers
(#<STANDARD-CLASS COMMON-LISP-USER::PASSWORD-ACCOUNT>
 #1=#<SB-PCL:SYSTEM-CLASS COMMON-LISP:T> #1#)
   [Condition of type SB-PCL::FIND-METHOD-LENGTH-MISMATCH]
See also:
  Common Lisp Hyperspec, FIND-METHOD [:function]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1005308033}>)

为什么会发生这种情况?又是什么

被要求找到一个带有专门化器的方法。

这里不好吗?

在这里,主withdraw函数有两个参数acctamt,因此为了从更具体的方法(使用3个参数而不是2个)调用它,我们可以向call-next-method提供不那么具体的withdraw方法的参数。但这还是没用的。

任何帮助都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-18 10:20:26

泛型函数的同义词列表()

泛型函数的方法需要有同余 lambda列表。语言标准描述了这意味着什么:同余Lambda-泛型函数的所有方法的列表

正如你所看到的,第一条规则说:

  • 每个lambda列表必须具有相同数量的所需参数。

必需的参数告诉我们必须提供哪些参数总是。泛型函数还允许可选、关键字和rest参数。但这是没有调度的。调度只适用于所需的参数和所有这些参数。

拥有相同数量的所需参数可以简化分派,并允许编译器使用错误的参数数检查函数调用。

可选参数需要是一致的,也是

还请注意,泛型函数的所有方法都需要有相同数量的可选参数。参见标准中的第二条规则。

措辞

  • 参数类似于lambda列表中的命名变量。
  • 在调用函数时提供了一个参数。

示例:

代码语言:javascript
复制
(defun foo (a b) (list a b))

ab是函数foo的参数。

代码语言:javascript
复制
(foo (+ 2 3) (* 4 5))

520是函数foo调用的两个参数。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44613571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档