2016-04-21 4 views
1

Я сделал программу в Common Lisp, и я также пытаюсь заставить ее работать и на Scheme, но она не работает. Я новичок в Схеме и MIT/GNU Scheme. Вот код в Common Lisp. Он работает отлично в LispWorks:Преобразование кода из Common Lisp в схему

(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/Scheme 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

В Общем Лиспе законно принимать car и cdr от () (aka nil): (car '()) - () и аналогичным образом для cdr. Это не относится к схеме. В частности, в вашем коде вы пытаетесь взять cadr что-то без предварительной проверки, cdr: (): вам нужно проверить это.