Common lisp 返回common lisp中倒数第二个列表元素

Common lisp 返回common lisp中倒数第二个列表元素,common-lisp,Common Lisp,我正试图通过人工智能的范例来学习CommonLisp。书中的一个练习是定义一个函数,该函数将返回给定列表的姓氏,而不带特定后缀或单词。例如,如果列表包含bruce banner,它将返回banner。这是我的解决方案,但是它仍然会返回最后一个元素,不管它是否是后缀 (Defun last-name (name) (if (member (last name) *suffix*) (Last-name (butlast name)) (last name))) 在哪里 (defpa

我正试图通过人工智能的范例来学习CommonLisp。书中的一个练习是定义一个函数,该函数将返回给定列表的姓氏,而不带特定后缀或单词。例如,如果列表包含bruce banner,它将返回banner。这是我的解决方案,但是它仍然会返回最后一个元素,不管它是否是后缀

(Defun last-name (name)
  (if (member  (last name) *suffix*)
  (Last-name (butlast name))
  (last name)))
在哪里

(defparameter *suffix* '( MD PHD DR))
本书中也介绍了类似的练习,使用“rest”而不是“butlast”省略列表中的前缀,并返回第一个元素。这很好

(defparameter *titles* '( Mr MRS MS SIR MADAM DR ADMIRAL MAJOR GENRAL ))
(Defun first-name (name)
  (if (member  (first name) *titles*)
  (first-name (rest name))
  (first name)))
我不确定姓氏函数中是否缺少任何内容,或者我的逻辑是否不正确。非常感谢您的帮助! 抱歉,如果这篇文章太长,这是我的第一篇文章,我不确定应该包括多大程度的细节


谢谢。

原因是
last
不返回列表的最后一个元素,而是返回包含最后一个元素的列表。即:

(last '(bruce banner phd))
;; -> (PHD), not PHD
实际上,
last
在列表后获取一个可选参数
n
,该参数默认设置为1,并返回一个包含第一个参数的最后
n
元素的列表(请参见)

因此函数
成员
不会返回true

尝试在以下位置更改函数:

(defun last-name (name)
  (if (member  (car (last name)) *suffix*)
      (Last-name (butlast name))
      (car (last name))))

非常感谢,这解释了很多