将代码从Common Lisp转换为Scheme

时间:2016-04-21 15:26:06

标签: scheme lisp 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))))))))

以下是我用于Scheme的代码:

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

这是我在麻省理工学院/ GNU计划上尝试时所得到的:

enter image description here

2 个答案:

答案 0 :(得分: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,这就是错误未出现在该语言中的原因。

答案 1 :(得分:4)

在Common Lisp中,采用car cdr(又名())的nil(car '())是合法的:()cdrcadr类似。这不是Scheme中的情况。特别是,在您的代码中,您首先尝试获取某些内容cdr,而无需先检查()是否为AJAX:您需要检查该内容。