我正在使用一个递归函数,该函数需要一个列表和一个值ex:'b'(a。b),如果找不到则返回nil,如果找到则返回t。我的问题在(cond((eq A(car L))t)线中,即使(cond((and(atom L(eq L))t))返回之后,似乎仍在检查条件。印象是,如果满足该条件,则执行停止并返回该函数,是否可以解决此问题呢,而且,im只能使用原始函数防御条件缺点汽车博士运算符+,-,空值当量列表原子symbolp
;test cases
(checkInner 'b '(a . b))
(checkInner 'f '(c e f))
(checkInner 'b '(b))
;function
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
)
(cond ((or (atom L) (eq A L)) nil)
)
(cond ((eq A (car L)) t)
(t (checkInner A (cdr L))
)
)
)
除非使用显式的(return-from checkInner value)
表达式,否则函数将返回其最后一个表达式的值。因此,函数返回的唯一值是最后一个cond
表达式;前两个测试将被忽略。
您需要将所有情况组合成一个COND
表达式。
此外,第二项测试不应使用or
。如果L
是原子,则它不等于L
,因为我们在前一种情况下进行了测试。
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
((atom L) nil)
((eq A (car L)) t)
(t (checkInner A (cdr L)))))
所以我将其修复,感谢您确认Barmer,这是我的解决方法
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
(t (cond ((or (atom L) (eq A L)) nil)
(t (cond ((eq A (car L)) t)
(t (checkInner A (cdr L))
)
)
)
)
)
)
)