对两个参数专门化泛型函数(多方法)



我正在尝试在common 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)

我是否误解了泛型函数的工作方式?我似乎不能正确地定义函数

是,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)
  ...)

最新更新