2012-09-20 120 views
-1

所以我昨天开始学习Lisp并开始做一些问题。Lisp返回值

我很难做的事情是插入/删除列表中的原子,同时保持列表相同前:(delete 'b '(g a (b) l))将给我(g a() l)

另外我遇到麻烦的是这个问题。 我想检查列表中是否有原子存在的位置。

我追踪到它,它表示它在一个点返回T,但随后被覆盖nil

你们能帮忙吗?

我使用

在第四届函数调用返回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

请注意,Common Lisp中有一个'delete'函数。它没有上述行为。如果你定义了你自己的函数delete,那么这个行为就不再被Common Lisp标准所定义,并且基本上取决于Lisp在这种情况下的行为。当然,你可以制作自己的符号包(一种名称空间),它有一个'delete'符号,与'cl:delete'无关。 – Kaz

回答

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的值出现在列表的其余部分的任何地方。第一种形式从来没有真正使用过。

提示:什么是正确的逻辑连接器?