2016-04-21 138 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的东西:你需要检查。