我正在尝试在常见的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)
我是否误解了泛型函数的工作原理?我似乎无法正确定义功能。
答案 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)
...)