所以我昨天开始学习Lisp并开始做一些问题。
我正在做的事情是在列表中插入/删除原子,同时保持列表相同,例如:(delete 'b '(g a (b) l))
将给我(g a () l)
。
我遇到麻烦的还有这个问题。 我想检查一下原子存在的列表中的任何地方。
我追踪它,并说它一度返回T
,但后来被nil
覆盖。
你们可以帮忙:)?
我正在使用(appear-anywhere 'a '((b c) g ((a))))
在第4次函数调用时返回T
但后来变为nil
。
(defun appear-anywhere (a l)
(cond
((null l) nil)
((atom (car l))
(cond
((equal (car l) a) T)
(T (appear-anywhere a (cdr l)))))
(T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))
答案 0 :(得分:3)
让我们看一个明显的问题:
(defun appear-anywhere (a l)
(cond
((null l) nil)
((atom (car l))
(cond
((equal (car l) a) T)
(T (appear-anywhere a (cdr l)))))
(T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))
想想上面的最后几行。
让我们稍微改变格式。
(defun appear-anywhere (a l)
(cond
((null l) nil)
((atom (car l))
(cond
((equal (car l) a) T)
(T (appear-anywhere a (cdr l)))))
(T
(appear-anywhere a (car l))
(appear-anywhere a (cdr l)))))
最后三行:作为默认值(这就是T
存在的原因),将计算最后两个表格。首先是第一个,然后是第二个。永远不会使用或返回第一个表单的值。
这可能不是你想要的。
目前,当a
的值出现在列表的其余部分的任何位置时,您的代码才会返回一些内容。第一种形式从未真正使用过。
提示:什么是正确的逻辑连接器?