将代码从Common Lisp转换为Scheme

Ben*_*enz 1 lisp scheme common-lisp mit-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))))))))
Run Code Online (Sandbox Code Playgroud)

这是我用于Scheme的代码:

(define (removeAdjc L)
     (if (null? L) L
        (if (equal? (car L) (cadr L)) (removeAdjc (cdr L))
              (append (list (car L)) (removeAdjc (cdr L)))
           ) ))
Run Code Online (Sandbox Code Playgroud)

这是我在MIT/GNU Scheme上尝试时得到的:

在此输入图像描述

Ren*_*nzo 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))))))
Run Code Online (Sandbox Code Playgroud)

请注意,在Common Lisp中(cadr nil)返回nil,这就是错误未出现在该语言中的原因.