2016-04-21 14 views
1

Ich habe ein Programm in Common Lisp erstellt und ich versuche, es in Scheme auch funktionieren zu lassen, aber es funktioniert nicht. Ich bin neu in Scheme und MIT/GNU Scheme. Hier ist der Code in Common Lisp. Es funktioniert gut in LispWorks:Konvertieren von Code aus Common Lisp in Schema

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

Hier ist der Code, den ich für Schema verwendet:

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

Dies ist, was ich bekomme, wenn es am MIT/GNU Schema versuchen:

enter image description here

Antwort

9

Der Grund des Fehlers ist, dass Sie nur das Ende der Liste mit (null? L) überprüfen, während Sie auch überprüfen sollten, ob die Liste ein Element hat (da Sie (cadr L) tun). So könnte eine korrekte Definition sein:

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

Beachten Sie, dass in Common Lisp (cadr nil) kehrt nil, und dies ist der Grund, aus dem der Fehler erscheint nicht in dieser Sprache.

+0

Es funktioniert jetzt, danke! – Benz

4

In Common Lisp, ist es legal, die car und cdr von () (aka nil) zu nehmen: (car '()) ist () und ähnlich für cdr. Dies ist in Schema nicht der Fall. Insbesondere in Ihrem Code, versuchen Sie, die cadr von etwas zu nehmen, ohne zuerst zu überprüfen, ob die cdr() ist: Sie müssen dafür überprüfen.