2012-09-20 168 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的值出現在列表的其餘部分的任何地方。第一種形式從來沒有真正使用過。

提示:什麼是正確的邏輯連接器?