在两个参数上专门化通用函数(多方法)

时间:2016-08-31 15:00:51

标签: lisp common-lisp clos

我正在尝试在常见的lisp中构建二叉搜索树。我使用CLOS定义了二进制搜索类,如下所示:

(defclass bst ()
  ((root :type node
         :accessor tree-root
         :initform nil
         :initarg root)))

我正在尝试定义一个接受树对象和键的泛型函数,如果树包含键则返回布尔值true,如果树不包含键则返回nil。

现在我对泛型函数有以下定义:

(defgeneric contains ((tree bst) (key))
   (:documentation "returns boolean of whether the given tree contains a particular key)

将文件加载到REPL中时出现以下错误(我使用的是SBCL):

Required argument is not a symbol: (TREE BST)

我是否误解了泛型函数的工作原理?我似乎无法正确定义功能。

1 个答案:

答案 0 :(得分:9)

是的,defgeneric定义了一个通用函数。您可以在defgeneric的调用中指定方法,也可以使用defmethod

您需要以下其中一项:

(defgeneric contains (tree key)
   (:documentation "returns boolean of whether the given tree contains a particular key")
   (:method ((tree bst) key) ...))

或:

(defgeneric contains (tree key)
   (:documentation "returns boolean if a given tree contains a given key"))

(defmethod contains ((tree bst) key)
  ...)