2016-04-21 76 views
1

我在Common Lisp中創建了一個程序,並且我試圖使它在Scheme中工作,但它不起作用。我是Scheme和MIT/GNU計劃的新成員。 這是Common Lisp中的代碼。它在Lispworks工作正常:將Common Lisp的代碼轉換爲Scheme

(defun removeAdjc (L) (cond ((null L) L) 
     (t (cond ((equal (car L) (cadr L)) (removeAdjc (cdr L))) 
     (t (append (list (car L)) (removeAdjc (cdr L)))))))) 

這裏是我用來計劃代碼:

(define (removeAdjc L) 
    (if (null? L) L 
     (if (equal? (car L) (cadr L)) (removeAdjc (cdr L)) 
       (append (list (car L)) (removeAdjc (cdr L))) 
      ))) 

這是我在嘗試它,當在MIT/GNU計劃:

enter image description here

回答

9

錯誤的原因是您只檢查列表的末尾,(null? L),而您應該檢查列表是否有一個元素(因爲您正在做(cadr L))。所以,正確的定義是:

(define (removeAdjc L) 
    (cond ((null? L) L) 
     ((null? (cdr L)) L) 
     ((equal? (car L) (cadr L)) (removeAdjc (cdr L))) 
     (else (cons (car L) (removeAdjc (cdr L)))))) 

注意,在Common Lisp的(cadr nil)回報nil,這是其錯誤未出現在該語言的原因。

+0

它正在工作,謝謝! – Benz

4

在Common Lisp中,採取carcdr()(又名nil)是合法的:(car '())()cdr。 Scheme中不是這種情況。特別是在你的代碼中,你試圖在不檢查cdr是否爲()的情況下采取cadr的東西:你需要檢查。