2013-09-23 63 views
2

我試圖做一個簡單的替換方法作爲一個新的Lisp用戶,但不明白爲什麼這不能正常工作。我的替換函數有問題

;replace element e1 with element e2 in a list L 
(defun my-replace (e1 e2 L) 
    (cond 
    ;if the first of L is e1, cons e2 & rest L 
    ((equal (car L) (e1)) (cons (e2) (my-replace (e1 e2 (cdr L))))) 
    ;else cons e1 & rest L 
    (t (cons (e1) (my-replace (e1 e2 (cdr L))))))) 

回答

6

你的代碼有幾個問題。首先,你有一些額外的括號。 e1表示e1的值,但(e1)表示功能e1的返回值。由於你沒有這樣的功能,它會失敗。

此外,您的循環缺乏終止條件。現在,在修正第一個問題時,它將無限期運行,始終採用第二個分支並以nil遞歸調用L

最後,第一個參數cons後者分支是錯誤的:當(car L)不匹配e1,要從(car L)構建結果,而不是e1,對不對?這是保留列表中的內容,而不是用第一個參數替換它。

這裏是固定的版本:

(defun my-replace (e1 e2 L) 
    (cond 
    ;;if at the end of list, terminate 
    ((null L) nil) 
    ;;if the first of L is e1, cons e2 & rest L 
    ((equal (car L) e1) 
    (cons e2 (my-replace e1 e2 (cdr L)))) 
    ;;else cons e1 & rest L 
    (t 
    (cons (car L) (my-replace e1 e2 (cdr L))))))