2016-05-05 8 views
2

Ich habe eine Liste, die mit Listen gefüllt ist, von denen einige Null sind. Meine Funktion durchläuft die Hauptliste und prüft, ob es leere Listen gibt. Wenn es leer ist, beseitigt es sie (oder sollte). Ich bekomme immer ein Auto: Vertragsverletzung Fehler, der mir sagt, dass es ein Paar erwartet, aber ein '() bekommen. Ich bin nicht sicher, wie man es ändert, um diesen Fehler nicht zu bekommen.Eliminierung von Nulllisten innerhalb einer Liste in Schema

 (define (take-out-nulls alist) 
     (cond ((null? (car alist)) (take-out-nulls (cdr alist))) 
     (#t (cons (car alist)(take-out-nulls (cdr alist)))))) 

Antwort

3

Sie haben eine Rekursion ohne Abschlussprüfung, das ist Ihre Funktion für die car von alist auch am Ende davon fragen weiter.

Einfach solcher Test auf die Funktion hinzufügen:

(define (take-out-nulls alist) 
    (cond ((null? alist) '()) 
     ((null? (car alist)) (take-out-nulls (cdr alist))) 
     (#t (cons (car alist) (take-out-nulls (cdr alist)))))) 

(take-out-nulls '(a()() b c())) ; => (a b c) 
+0

Wow verwenden könnte, kann ich nicht glauben, dass ich das verpasst. Ich danke dir sehr. – Leena

0

Sie auch

(define (take-out-nulls alist) 
    (filter (λ (x) (not (empty? x))) alist)) 

(take-out-nulls '(a()() b c())) ;=> (a b c)