2012-10-23 62 views
2

大家好我正在嘗試構建一個帶有字母和數字的混合列表。例如,當你調用funciton(inc-list1'(cat 4 dog 3 x 5))=>(cat 5 dog 4 x 6)。我非常肯定邏輯是正確的,所以我認爲我錯過了語法中的某些東西。這是我的代碼構造混合列表

(defun inc-list1 (list) 
     (cond ((null list) 
       nil 
      ) 
      (numberp (first list) 
        (cons (+ 1 (first list)) (inc-list1 (rest list))) 
      ) 
      (T 
      cons (first list) (inc-list1 (rest list)) 
      ) 
     ) 
    ) 
+0

你會得到什麼錯誤? – joergl

回答

0

代碼中有各種拼寫錯誤。這裏是一個固定的版本

(defun inc-list1 (list) 
    (cond ((null list) 
      nil 
     ) 
     ((numberp (first list)) 
      (cons (+ 1 (first list)) (inc-list1 (rest list))) 
     ) 
     (t 
      (cons (first list) (inc-list1 (rest list))) 
     ) 
     ) 
) 

注意周圍的numberpcons函數調用添加括號和小寫的t

1

的你如何能已接近了問題的一個例子:

(defun mapcar-if (list test if-true &optional (otherwise #'identity)) 
    (mapcar 
    #'(lambda (x) 
     (funcall 
     (if (funcall test x) 
      if-true 
      otherwise) x)) list)) 

(mapcar-if '(cat 4 dog 3 x 5) #'numberp #'1+) 

這將使該功能有點太其他情況下更爲有用。

您的代碼:

  1. (T cons ...)沒有做什麼,你認爲它。您可能想要致電cons而不是簡單地提及它。以你所採用的方式提及它沒有任何作用,也沒有副作用(如果符號缺陷被解除了,它會產生副作用 - 即你會收到一個錯誤)。無論接下來發生的是前一個錯誤的結果。撥打(first list)也沒有副作用(在你的情況下)。

  2. 以您所做的方式「列出」列表並不是一項特別好的技術。因爲這項技術已經在其他功能(例如mapcar,reduce等)中實現了,所以它們的編寫目的是爲了減少寫入程序時必須鍵入的文本數量,並且使其更容易閱讀寫了它。 ;)