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