我编写了一个查询我正在为学校编写的小型数据库程序的函数。该功能按名称搜索。当我自己运行该功能时,它可以工作。当我在菜单中运行它时,它不起作用(返回NIL)。这是所有相关的内容:
(defun prompt-read (prompt)
(format *query-io* "~a: " prompt)
(force-output *query-io*)
(read-line *query-io*))
(defun search-name (name)
(remove-if-not
#'(lambda (cat) (equal (getf cat :name) name)) *db*))
(defun input-name ()
(search-name
(prompt-read "Name")))
(defun search-menu ()
(print "1) Search Name")
(print "2) Search Color")
(print "3) Search Min. Weight")
(print "4) Search Min. Experience")
(print "5) Search Min. Length")
(setf choose (read))
(cond ((= choose 1)(input-name))
((= choose 2)(print "Color"))
((= choose 3)(print "Weight"))
((= choose 4)(print "XP"))
((= choose 5)(print "Color"))
)
NIL
)
目前,我仅致力于使名称搜索生效,菜单的其余部分只是占位符。当我自己运行“输入名称”(使用搜索名称)时,它将返回正确的结果。当我尝试搜索菜单中的第一个选项(也运行“输入名称”)时,它返回NIL。我想知道为什么当我单独运行它时可以运行,而与该菜单一起使用时却不能运行。如果有人需要任何其他信息,请随时询问。我会尽力提供它。另外,我是初学者,所以请原谅我。
当调用input-name
时,您正在传递符号作为参数。但是,prompt-read
返回一个字符串,这就是传递给input-name
的内容。一种可能的解决方案是使用string-equal
而不是equal
中的search-name
,并确保*db*
包含字符串而不包含符号。