Recursion CLISP递归函数,如果它是列表的成员,则返回ATOM

Recursion CLISP递归函数,如果它是列表的成员,则返回ATOM,recursion,common-lisp,Recursion,Common Lisp,我需要帮助找出我的代码有什么错误,这是分配给我的问题: 编写一个名为MYMEMBER的递归函数,该函数接受一个原子(atm)和一个列表(lst),如果原子是成员,则返回该原子,否则返回NIL 例如(我的成员'D'(A B C D E F G)返回=>D 例如(我的成员'H'(A B C D E F G)返回=>NIL 这就是我所拥有的: (defun mymember(atm lst) (条件((空lst)无) ((相等atm(汽车lst))lst) (t(我的会员atm(cdr lst()()

我需要帮助找出我的代码有什么错误,这是分配给我的问题:

编写一个名为MYMEMBER的递归函数,该函数接受一个原子(atm)和一个列表(lst),如果原子是成员,则返回该原子,否则返回NIL

例如
(我的成员'D'(A B C D E F G)返回=>D

例如
(我的成员'H'(A B C D E F G)返回=>NIL

这就是我所拥有的:

(defun mymember(atm lst)
(条件((空lst)无)
((相等atm(汽车lst))lst)
(t(我的会员atm(cdr lst()())))
地雷返回:

(我的成员'd'(a b c d e f g))
==>(D E F G)

如何修复它,使其只返回D,而不返回列表的其余部分?

查看
cond
中的第一个术语,将原子与列表的第一个元素进行比较。如果匹配,则返回
lst
。您认为您已经使用
car
lst
是原子吗?

Style/reada可扩展性:添加连字符,不要缩写单词,在cond之后换行(“mymember”=>“my member”,“atm”=>“atom”,“lst”=>“list”),您可以创建两个不同的字符串,它们都有“foo”字符。即使它们不是相同的字符串,它们也将相等。要测试一个“foo”在列表中,您不能使用EQUAL,因为它会识别另一个。我建议使用EQL(可选EQ不适用于数字和字符)。您有一个非常简单/容易的错误,只要盯着它看,必要时用铅笔和纸手动执行即可。Lisp在这里没有什么特别之处。