将代码从 Common Lisp 转换为 Scheme

Convert code from Common Lisp to Scheme

我用 Common Lisp 编写了一个程序,我试图让它在 Scheme 中也能工作,但它不工作。我是 Scheme 和 MIT/GNU Scheme 的新手。 这是 Common Lisp 中的代码。它在 Lispworks 中运行良好:

(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))))))))

这是我用于 Scheme 的代码:

(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 方案上尝试时得到的结果:

在Common Lisp中,取()(又名nil)的carcdr是合法的:(car '())()cdr 类似。在 Scheme 中不是这样。特别是,在您的代码中,您试图在不首先检查 cdr 是否为 () 的情况下获取某些内容的 cadr:您需要检查它。

错误的原因是您只检查了列表的末尾,(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) returns nil 中,这就是该语言未出现错误的原因。